Thứ Tư, 15 tháng 8, 2012

Sự khác nhau giữa trình biên dịch và trình thông dịch


1. Trình thông dịch
Trình thông dịch là một trình để thông dịch ngôn ngữ. Trong thông dịch mã nguồn của chương trình không được dịch trước thành ngôn ngữ máy, mà khi chạy chương trình mã nguồn mới được dịch và thực thi từng dòng lệnh 1.
Tất cả các ngôn ngữ không biên dịch ra mã máy một lần duy nhất điều phải sử dụng trình thông dịch (PHP, WScripts, Perl, Linux Shell, Python....). Các ngôn ngữ theo trình thông dịch thường được gọi là script (kịch bản.
Như vậy chương trình viết bằng ngôn ngữ script phải có một trình thông dịch kèm theo khi chạy chương trình.

Ưu điểm
- Phát triển nhanh chóng
- Có thể chỉnh sửa mã nguồn bất kỳ khi nào
- Mạnh xử lý cú pháp
- Uyển chuyển mềm dẻo.

- Có thể chạy trên mọi nền tảng (flatform, hệ điều hành) nếu có trình thông dịch tương ứng, tại vì không phải là ngôn ngữ máy(chỉ là file văn bản) nên không bị phụ thuộc vào HĐH. tiêu biểu là Perl, PHP, Python

Nhược điểm
- Tại vì là ngôn ngữ thông dịch chạy line by line nên nên ngôn ngữ thông dịch không hỗ trợ đa luồn (multi thread), giao dịch (transaction)
 - Cũng do chạy line by line nên tốc độ thực thi không nhanh bằng các chương trình viết bằng ngôn ngữ biên dịch (C, C++, VB...) đã chuyên trực tiếp ra ngôn ngữ máy.
2. Trình biên dịch
 Trình biên dịch sẽ dịch mã nguồn thành mã máy trên một HĐH xác định và chỉ chạy trên hệ điều hành đó, do đó các chương trình được biên dịch sẽ phụ thuộc nhiều vào nền tảng và hệ điều hành
Ưu điểm
- Ràng buộc chặt chẽ về kiểu trong ngôn ngữ.
- Hỗ trợ các tính năng đa tuyến, transtion ...
- Do đã biên dịch phụ thuộc vào hệ điều hành nên chương trình có thể tận dụng toàn bộ các tính năng đặc trưng của HĐH
- Tốc độ thực thi tốt
- Bảo mật tốt (không thể xâm phạm mã nguồn làm thay đổi chức năng của chương trình)
- ....

Nhược điểm

- Sau khi biên dịch ra ngôn ngữ máy thì chỉ có thể chạy trên một HDH xác định.


(ST)

Thứ Ba, 24 tháng 7, 2012

Design Pattern - Factory Method

1. Ý nghĩa
Định nghĩa 1 interface cho việc tạo đối tượng nhưng lớp con kế thừa nó quyết định đối tượng được tạo.

2. UML
  • Product  (Page)
    • defines the interface of objects the factory method creates
  • ConcreteProduct  (SkillsPage, EducationPage, ExperiencePage)
    • implements the Product interface
  • Creator  (Document)
    • declares the factory method, which returns an object of type Product. Creator may also define a default implementation of the factory method that returns a default ConcreteProduct object.
    • may call the factory method to create a Product object.
  • ConcreteCreator  (Report, Resume)
    • overrides the factory method to return an instance of a ConcreteProduct.
3. Code demo
    abstract class Product
    {
    }
    class ConcreteProductA: Product
    {

    }
    class ConcreteProductB : Product
    {
    }
    abstract class Creator
    {
        public abstract Product FactoryMethod();
    }

    class ConcreteCreatorA : Creator
    {
        public override Product FactoryMethod()
        {
            //throw new NotImplementedException();
            return new ConcreteProductA();

        }
    }
    class ConcreteCreatorB : Creator
    {
        public override Product FactoryMethod()
        {
            //throw new NotImplementedException();
            return new ConcreteProductB();
        }
    }

Thứ Hai, 23 tháng 7, 2012

Design Pattern - Decorator

1. Đặt vấn đề
Khi xây dựng một ứng dụng, một thời gian nào đó chúng ta muốn mở rộng và thay đổi ứng dụng cho phù hợp với nhu cầu thực tế nhưng vấn đề này sẽ mất rất nhiều thời gian hơn là việc phát triển một ứng dụng mới hoàn toàn.
 Do đó trước khi xây dựng một ứng dụng chúng ta phải thiết kế ứng dụng làm sao để thuận lợi cho việc mở rộng ứng dụng, mẫu Decorator sẽ giúp chúng ta giải quyết được vấn đề này.
2.Ý nghĩa
 Mẫu decorator cung cấp phương pháp mềm dẻo cho phép các lớp con mở rộng các chức năng.
3. UML

participants

    The classes and/or objects participating in this pattern are:
  • Component   (LibraryItem)
    • defines the interface for objects that can have responsibilities added to them dynamically.
  • ConcreteComponent   (Book, Video)
    • defines an object to which additional responsibilities can be attached.
  • Decorator   (Decorator)
    • maintains a reference to a Component object and defines an interface that conforms to Component's interface.
  • ConcreteDecorator   (Borrowable)
    • adds responsibilities to the component.
4. Code demo
  class ConcreteComponent : Component
    {
        public override void Operation()
        {
            Console.WriteLine("ConcreteComponent:Component");
        }
    }

    abstract class Decorator
    {
        Component _component;
        public Decorator(Component component)
        {
            this._component = component;
        }
        public void Operation()
        {
            if (_component != null)
            {
                _component.Operation();
            }
        }
    }
    class ConcreteDecoratorA:Decorator
    {
        public void Operation()
        {
            base.Operation();
            Console.WriteLine("ConcreteDecoratorA");
        }
    }
    class ConreteDecoratorB : Decorator
    {
        public void Operation()
        {
            base.Operation();
            Console.WriteLine("ConcreteDecoratorB");
        }
    }

 

Chủ Nhật, 22 tháng 7, 2012

Design Pattern - Strategy

1. Đặt vấn đề
  Đầu tiên bạn có đối tượng, trong đối tượng này có 1 phương thức, sau một thời gian để phù hợp với nhu cầu chương trình bạn phải thay đổi phương thức này, khi đó bạn tạo 1 lớp mới kế thừa lớp cũ và ghi đè phương thức đó, cứ mỗi lần chỉnh sửa, mở rộng code như vậy làm chương trình bạn rất rối và khó kiểm soát. Mẫu strategy sẽ giúp bạn giải quyết điều này bằng cách tách phần chức năng dễ thay đổi này ra một lớp riêng, định nghĩa một tập hợp các thuật toán cho chứng năng đó và lựa chọn thuật toán phù hợp với bài toán cụ thể
2. Định nghĩa
 Định nghĩa một tập hợp các thuật toán, đóng gói chúng thành từng loại một và giúp chúng dễ hoán đổi cho nhau. Mẫu strategy giúp các thuật toán độc lập hơn khi sử dụng
3. Mô hình UML

Giải thích:
Strategy: Định nghĩa một interface chung cho tất cả các thuật toán
ConcreteStrategy: Cài đặt các thuật toán cụ thể
Context: Tham chiếu đến 1 đối tượng Strategy, cho phép lựa chọn thuật toán cụ thể trong trường hợp cụ thể
4. Code demo
abstract class Strategy
    {
       public abstract  void algorithm();
    }
    class ConcreteStrategyA : Strategy
    {
        public override void algorithm()
        {
            Console.WriteLine("ConcreteStragyA:Strategy");
        }
    }
    class ConcreteStrategyB : Strategy
    {
        public override void algorithm()
        {
            Console.WriteLine("ConcreteStragyB:Strategy");
        }
    }
    class Context
    {
        private Strategy _strategy;
        public Context(Strategy strategy)
        {
            _strategy = strategy;
        }
        public void algorithm()
        {
            _strategy.algorithm();

        }
    }
5. Kết luận
Mẫu strategy dùng trong các trường hợp sau:
- Có một đoạn code dễ thay đổi, chúng ta sẽ tách nó ra để có thể dễ dàng bảo trì
- Tránh sự răng rối, khi phải cài đặt lại một chức năng nào đó quá nhiều ở lớp con
- Muốn thay đổi thuật toán khi chạy chương trình

Thứ Năm, 19 tháng 7, 2012

Design Pattern - Singleton

1. Đặt vấn đề
Trong một dự án lớn chúng ta có hàng trăm đến hàng nghìn đối tượng, nhưng tại một thời điểm chưa chắc chúng ta đã sử dụng hết tất cả các đối tượng đó, điều này dẫn đến việc lãng phí tài nguyên và làm chương trình chạy chậm. Mẫu singleton ra đời để giải quyết vấn đề đó
2.Định nghĩa(GOF)
 Mẫu singleton đảm bảo  chắc chắn 1 lớp chỉ có duy nhất 1 thể hiện và cung cấp 1 điểm (point) toàn cục để truy cập đến nó.
3. Sơ đồ UML
Phương thức Instance() dùng để tạo đối tượng Singleton

4. Code demo (c#)
4.1. Demo chưa quan tâm đến vấn đề đa luồng
class Singleton
    {
        private static Singleton _instance;
        public Singleton()
        {
        }
        public static Singleton instance()
        {
            if (_instance == null)
            {
                _instance = new Singleton();
            }
            return _instance;
        }
    }
NX: Với cách cài đặt trên chỉ một đối tượng duy nhất của lớp Singleton được tạo ra. Tuy nhiên nó gặp 1 vấn đề đó là khi có nhiều luồng cùng kiểm tra điều kiện if tại cùng 1 thời điểm thì chúng đều thỏa mãn do đó có nhiều đối tượng sẽ được tạo ra tại 1 thời điểm.
 4.2. Demo quan tâm đến vấn đề đa luồng
Có nhiều cách để xử lý vấn đề xảy ra ở cách cài đặt 4.1, ở đây tôi giới thiệu 2 cách.
Cách 1: 

class Singleton
    {
        private static Singleton _instance;
        public Singleton()
        {
        }
       private static object syncLock = new object();
        public static Singleton instance()
        {
           lock(syncLock){
              if (_instance == null)
               {
                _instance = new Singleton();
             }
          }
            return _instance;
        }
    }
 Nhược điểm: Có thể làm chương trình chạy chậm.
Cách 2:
 class Singleton
    {
        private static Singleton _instance = new Singleton();
        public Singleton()
        {
        }
        public static Singleton instance()
        {
             return _instance;
         }
}

Để trở thành một lập trình viên

Để trở thành một lập trình viên


Không bao giờ sợ phải bắt đầu.
Tôi sẽ không viết hai lần cùng một đoạn mã giống nhau.
Khi phát triển phần mềm, hãy nghĩ đến tương lai.
Viết mã càng ít bao nhiêu ,mắc lỗi càng ít bấy nhiêu.
Bạn sẽ không bao giờ trở thành một lập trình viên giỏi nếu chỉ tập luyện 2giờ mỗi ngày.
Tất cả các công việc đều có phần thú vị và phần buồn chán, không có ngoại lệ.
Kẻ thù số một của cáclập trình viên là gì? Kiê ucăng.
Lập trình viên sử dụng hầu hết thời gian của mình vào việc sửa lỗi. Chương trình càng dễ đọc bao nhiêu càng tiết kiệm thời gian bấy nhiêu.
Trường học khiến các bạn tin rằng chương trình của bạn chỉ cần thỏa mãn một mình bạn là đủ. Điều này hoàn toàn sai lầm. Chương trình phải thỏa mãn khách hàng và các lập trình viên khác.


Giới thiệu

Thế là bạn nghĩ rằng lập trình là một thế giới vô cùng thú vị, và bạn muốn tham gia vào thế giới ấy? Trước khi bạn bắt đầu, điều duy nhất mà tôi muốn khuyên là: nếu bạn thực sự yêu thích lập trình thì đó rõ ràng là công việc tốt nhất mà bạn có thể có được. Ngược lại, nếu bạn chỉ cảm thấy thích, hay không quan tâm lắm đến lập trình, thì đó rõ ràng là công việc tồi tệ nhất của bạn. Bởi vì bạn đang gia nhập vào một thế giới mà sự cạnh tranh luôn là nỗi ám ảnh không thể tránh khỏi. Phát triển phần mềm gần như là một cuộc đua tranh. Trong đó, cuộc sống của bạn là một con đường và bạn phải chạy càng nhanh càng tốt, không cần biết dưới chân có gì, cho đến khi gặp đồng bằng hoặc là đụng phải vách đá cheo leo. Nếu bạn sẩy chân, mọi thứ kết thúc, và đó hoàn toàn là lỗi của bạn. Nghe có vẻ hơi ghê gớm đúng không? Nhưng đừng để những điều đó làm bạn nản lòng. Tôi chỉ không muốn vẽ nên một viễn cảnh tươi đẹp, nơi có những cánh đồng xanh ngút ngàn và những đám mây lững lờ trôi trên nền trời xanh thẳm. Thực tế là có thể chỉ vài phút sau đó trời sẽ mưa và bạn thì chẳng mang theo dù. Thế nhưng, chính những điều không chắc chắn, những thách thức và áp lực sẽ làm cho cuộc sống trở nên đầy hứng thú.
Bạn vẫn còn đọc đến đây ư? Rất tốt, thế có nghĩa là bạn hoàn toàn nghiêm túc về điều này. Bây giờ điều tôi sẽ nói với bạn là một bản phác thảo về những gì đang chờ đợi bạn trong thế giới lập trình, chúng ta sẽ nói một ít về kỹ thuật và cả những niềm vui của thế giới ấy.

Bạn cần gì để trở thành một lập trình viên?


Tôi không nghĩ rằng có một vài yêu cầu khó khăn nào đó khiến bạn không thể trở thành lập trình viên, tôi chỉ đơn giản nghĩ rằng bất cứ ai có một ít (hay rất nhiều) mong muốn đều có thể trở thành lập trình viên. Vấn đề chỉ là bạn dành ra bao nhiêu thời gian. Điều đó có nghĩa là tôi nghĩ có nhiều quan niệm sai lầm về những kỹ năng cần có để trở thành lập trình viên. Trước tiên, bạn không cần phải thật xuất sắc trong môn Toán, bạn chỉ cần có khả năng hiểu được những điều cơ bản. Dĩ nhiên là có những ngoại lệ, nếu bạn có hứng thú trong lĩnh vực đồ họa hay lập trình game thì một kiến thức Toán vững vàng sẽ giúp bạn rất nhiều. Một quan niệm sai lầm khác là bạn cần phải là thiên tài logic. Nói chung, điều đó không phải là bắt buộc, dĩ nhiên tư duy logic càng tốt thì càng dễ dàng hơn khi tiếp cận thế giới lập trình. Vậy thì kỹ năng nào là cần thiết? Bị thúc đẩy bởi những thách thức là yếu tố quan trọng nhất. Đơn giản là vì bạn đang tham gia vào một trò chơi trong đó thách thức xuất hiện trong mọi ngõ ngách. Một điều quan trọng khác là phải không ngừng theo đuổi mục tiêu, nhưng vẫn phải luôn uyển chuyển để không đuổi theo một cách mù quáng những mục tiêu xa vời.

Còn trường học thì sao?


Trường học là nơi tuyệt vời để học mọi thứ ngoại trừ công nghệ. Đừng cho là tôi sai, tôi không nói rằng tôi nghĩ trường học là không quan trọng. Ngược lại, tôi nghĩ trường học là rất quan trọng, nhưng không phải để học lập trình. Những gì bạn nên tập trung thật sự ở trường là học cách để làm việc với những người khác trong một đề án. Cũng như học cách những người xung quanh giải quyết vấn đề và cách thức giải quyết của họ khác cách của bạn ở chỗ nào. Trường học thường bắt bạn phải làm những thứ có thể bạn không thích. Chẳng hạn, tôi nhớ lúc tôi học môn “Thiết kế trình biên dịch”, tôi tự nhủ: “Thật là mất thời gian một cách vô ích, tôi chẳng bao giờ cần phải thiết kế trình biên dịch làm gì”. Nhưng, điều tôi đã học được là làm thế nào để giải quyết những vấn đề hoàn toàn khác nhau, và kiến thức này giúp tôi làm được nhiều việc khác.
Một trong những thuận lợi bạn có được từ trường học là bạn có thể gặp gỡ bạn bè có cùng chí hướng và có thể sau này trở thành đồng nghiệp của bạn. Ngành công nghiệp phần mềm ở nhiều khía cạnh rất giống với ngành công nghiệp điện ảnh, khi có ai đó bị lôi cuốn vào một đề án đầy tham vọng, họ thường mời bạn bè cùng hợp tác. Nếu bạn không biết họ từ trước, bạn sẽ không thể mời (hay thuê), và trong nhiều trường hợp, trường học chính là nơi bạn có thể tìm được những người có cùng sở thích. Một khía cạnh khác không thể bỏ qua là trường học không chỉ dạy về kỹ thuật mà còn dạy về lịch sử, về tâm lý,… Và trong khi những thứ ấy có vẻ không liên quan trực tiếp đến lập trình, bạn có thể sẽ rất ngạc nhiên nếu biết rằng đó cũng là một trong những nguồn cảm hứng mà tôi từng có. Tôi nên bắt đầu từ đâu?

Trước tiên, tôi khuyên là bạn nên cân nhắc cẩn thận trước khi có một quyết định quan trọng. Như tôi đã nói, thế giới lập trình có thể rất lý thú, nhưng cũng đầy gian nan. Do đó, đừng bao giờ nhảy bổ vào mà không suy nghĩ kỹ. Việc đầu tiên cần làm dĩ nhiên là tìm mua một cuốn sách dạy lập trình. Nhưng có quá nhiều sách và quá nhiều ngôn ngữ. Tôi khuyên bạn nên chọn một trong các ngôn ngữ
sau: C, C++, Visual Basic, Pascal (Delphi) hay Java. Khoan hãy nghĩ đến những ngôn ngữ khác, bởi vì chúng hoặc là quá phức tạp cho người mới bắt đầu hoặc là quá đơn giản để có thể đưa bạn vào thế giới lập trình. Nhưng dù thế nào thì bạn cũng nên chọn một ngôn ngữ vào thời điểm này. Những ngôn ngữ này rất giống nhau, và vô cùng mạnh mẽ. Hầu như mọi ứng dụng thương mại đều có thể được viết bởi một trong những ngôn ngữ trên. Phương pháp của tôi là chọn 2 quyển sách cho mỗi ngôn ngữ đã nêu ở trên. Đọc sơ qua trước, và chú ý các ví dụ, mã nguồn trong đó. Sau khi đã đọc sơ qua tất cả các quyển sách đã chọn, hãy chọn quyển sách gây cho bạn nhiều hứng thú nhất. Và ngôn ngữ mà quyển sách đó đề cập chính là ngôn ngữ bạn nên học đầu tiên. Bây giờ hãy chọn thêm vài quyển sách về ngôn ngữ đó, mỗi quyển, bạn hãy đọc một phần chương đầu tiên, bạn có cảm thấy quan tâm đến nó không? Nếu không, hãy bỏ quyển sách ấy và chọn một quyển khác; nếu có, hãy lật đến giữa quyển sách và một phần chương mà bạn bắt gặp, vẫn cảm thấy quan tâm đến quyển sách ấy đúng không? Tốt, đó là quyển sách có thể bạn sẽ chọn. Đừng cố hiểu nó viết cái gì, chỉ cần tìm hiểu xem nó có mang đến cho bạn sự quan tâm về ngôn ngữ đó hay không. Tiếp tục phương pháp này cho đến khi không còn quyển sách nào cả, bạn có thể tìm được quyển sách gây cho bạn nhiều hứng thú nhất để học ngôn ngữ đó.

Những công cụ cần thiết

Hãy nhìn thẳng vào vấn đề, chọn đúng công cụ sẽ làm cho công việc trở nên dễ dàng hơn. Điều này càng chính xác hơn trong lĩnh vực phát triển phần mềm. Có thể Microsoft đã tạo ra môi trường phát triển tốt nhất, Microsoft Developers Studio. Do đó, nếu bạn dùng C/C++, Visual Basic,… thì có lẽ đây sẽ là thứ bạn cần. Tuy nhiên, vẫn có nhiều công cụ thay thế miễn phí khác cho những ngôn ngữ này. Bạn có thể kiểm tra thử nếu thích.
Một công cụ khác cũng rất quan trọng, đó là trình soạn thảo mã lệnh (code editor). DevStudio có một trình soạn thảo mã lệnh tích hợp sẵn, và đó là một trong những lý do khiến nhiều người dùng nó. Cá nhân tôi không thích bị ràng buộc bởi một môi trường phát triển nào. Do đó, tôi thích dùng công cụ soạn thảo MultiEdit. Tôi đã sử dụng nó trong nhiều năm. Và tôi rất tự hào khuyên những ai muốn tìm một công cụ thay thế cho DevStudio hãy dùng nó.

Hãy là người lạc quan

Tôi từng nghe người ta nói rằng kẻ lạc quan nhất trên thế giới chính là nhà phát triển phần mềm. Trong suy nghĩ của họ, không có phần mềm nào là không thể viết được. Một ví dụ nhỏ, bạn hãy vào thử một site download phần mềm nào đó mà xem. Có hàng trăm hàng ngàn phần mềm bao gồm mọi lĩnh vực. Làm thế nào mà người ta có thể sáng tạo ra từng ấy phần mềm. Chúng nhiều và tốt đến nỗi bạn không thể nghĩ ra nên sáng tạo thêm phần mềm nào. Thế nhưng từng ngày từng giờ, các nhà phát triển phần mềm luôn sáng tạo và cho ra nhiều phần mềm mới hơn nữa, những phần mềm mà đã có thời người ta cho là không thể tạo ra được. Dù sao thì lạc quan mấy cũng phải có giới hạn. Mấu chốt của vấn đề là họ không nhìn mọi thứ một cách tổng thể, mà ở từng phần cụ thể. Ở một chừng mực nào đó, có thể xem đấy là đặc trưng của ngành thiết kế phần mềm, chia dự án ra thành những phần nhỏ và giải quyết từng phần. Nếu bạn không phân phối thời gian hợp lý, bạn sẽ không thể nào hoàn thành công việc. Khi bạn bắt đầu viết chương trình “thực sự” đầu tiên (nghĩa là chương trình có thể thực hiện được một công việc nào đó cần thiết cho mọi người, không phải cho riêng bạn), phải chắc chắn rằng bạn dành đủ thời gian để vạch ra kế hoạch về những việc bạn định làm, thứ tự thực hiện, và kết quả cuối cùng là gì. Nếu bạn làm điều này, bạn sẽ thấy mọi thứ trở nên dễ dàng hơn và có thể hoàn thành nhanh hơn là bạn nghĩ.

Hãy làm việc theo nhóm!

Nếu bạn dự định trở thành một lập trình viên đơn độc, hãy suy nghĩ lại. 99,9% các dự án đòi hỏi phải làm việc theo nhóm. Và do đó, bạn cần phải có kinh nghiệm làm việc theo nhóm, phối hợp với những người khác trong một dự án. Một khi bạn đã hoàn thành những dự án nhỏ của riêng mình, đó là lúc bắt đầu tìm cách tham dự vào một dự án có nhiều người tham gia. Đó có thể là một game, một bản demo, hay bất cứ thứ gì. Chỉ cần đó là dự án làm bạn quan tâm. Có nhiều các để tìm dự án, bạn có thể gia nhập vào những dự án đã có, tìm kiếm những nhóm vừa mới thành lập và xin gia nhập, hay thậm chí tự lập một dự án và mời người khác cùng cộng tác. Điều quan trọng nhất là bạn phải học cách làm việc cùng với những người khác để thực hiện mục tiêu chung.

Những thứ nên đọc!
Đọc sách là nguyên tắc cơ bản… Và điều này càng chính xác trong ngành phát triển phần mềm. Nếu bạn là người không thích đọc sách, có lẽ bạn nên chọn một công việc khác. Bởi vì đọc sách chính là chìa khóa để củng cố và hiện thực hóa những tiềm năng của bạn. Bạn có thể tự hỏi vì sao tôi có thể viết nhiều phần mềm trong thời gian ngắn như thế? Có 3 lý do chính: kinh nghiệm, những đồng nghiệp tài năng mà tôi luôn hài lòng khi được làm việc chung và cuối cùng là những quyển sách tôi đã đọc. Tôi không thể giúp bạn có được kinh nghiệm và những bạn đồng nghiệp giỏi, nhưng tôi có thể giới thiệu cho bạn những quyển sách hay:

Code Complete, ISBN: 1-55615-484-4.

Đây là quyển sách cần thiết cho mọi nhà phát triển phần mềm, bất kể họ đang dùng ngôn ngữ lập trình nào. Nó bao gồm nhiều bài thực hành và nhiều kỹ thuật liên quan đến phong cách viết mã.

Rapid Development, ISBN: 1-55615-900-5.

Quyển sách này hướng đến việc lập kế hoạch cho một dự án, tập trung vào những lỗi tiềm ẩn có thể mắc phải,… Đây là quyển sách cho bạn biết thế giới thực sự của ngành phát triển phần mềm.

Dynamics of Software Development, ISBN: 1-55615-823-8.

Quyển sách này có một hướng tiếp cận khác, tập trung vào việc làm việc theo nhóm và động lực của việc lập trình. Đây là điều thỉnh thoảng bị xem nhẹ, và hậu quả có thể được thấy trong nhiều dự án bị thất bại.

The Mythical Man-Month, ISBN: 0-201-83595-9.
Đây thực sự là một quyển sách nên đọc. Dù rằng nó đã được viết cách đây hơn 20 năm, thế nhưng vẫn có nhiều điều có thể áp dụng.

Programming Windows, ISBN: 1-57231-995-X.
Nếu bạn có ý định lập trình trên Windows (bằng C hay C++), bạn cần phải mua quyển sách này. Theo tôi đây là quyển sách dạy lập trình Windows tốt nhất.

The Art of Ware, ISBN: 1-55851-396-5.

Tôi là một người hâm mộ cuồng nhiệt Tôn Tử, do đó tôi rất thích thú khi đọc quyển sách này. Đây là một quyển sách có phong cách viết rất lôi cuốn, với những bài học trong binh pháp Tôn Tử được vận dụng vào ngành phát triển phần mềm.

Tổng kết

Hy vọng tôi đã nêu được một số điều cần thiết để trở thành một lập trình viên, không phải về mặt kỹ thuật mà là về mặt tư duy. Cá nhân tôi cho rằng lập trình là một công việc đầy hứng thú. Không có gì vui hơn khi nhìn thấy ai đó đang sử dụng phần mềm do bạn viết để làm cho cuộc sống của họ tốt hơn, dù chỉ là một phần nào đấy. Do đó, nếu bạn quyết định theo đuổi ngành phát triển phần mềm, tôi xin chúc bạn may mắn và hy vọng một ngày nào đó tôi sẽ có dịp download phần mềm do bạn viết để sử dụng.

Nguồn: Chưa rõ, cập nhật sau.