
Đến thời điểm này, một trong những quyết định sáng suốt nhất cuộc đời mà tôi có thể khẳng định với bản thân, đó là việc học lập trình. Dĩ nhiên tôi không phải là lập trình viên, và cũng không có ý định trở thành lập trình viên (mặc dù ước vọng thầm kín của tôi vẫn là một ngày được làm bá chủ C++), nhưng những bài học về giải quyết vấn đề trong cuộc sống mà việc học lập trình đã đem lại cho tôi thì giá trị phải cao gấp mấy lần việc đọc ba cái sách tự giúp bản thân nhảm nhí.
Vậy self-help thì sao?
Và trong bài viết này, tôi sẽ chỉ cho bạn thấy những bài học đó là gì, với hy vọng rằng chúng sẽ có ích cho bạn. Và ai biết được, có thể nhờ chúng mà bạn sẽ quyết định xách đít lên và học lập trình thì sao?
Ngoài ra, như đã nói, tôi không phải là lập trình viên. Thế nên trong nội dung bài viết có chỗ nào hiểu sai về concept lập trình, hy vọng được dựa trên tính hiệu quả thực tế mà chiếu cố.
1. Phân chia vấn đề thành những phần nhỏ
Một trong những việc đầu tiên bạn cần làm khi học lập trình, đó là sơ đồ tư duy. Điều này vì viết một chương trình lớn không dễ dàng, và bạn cần phải chia nhỏ các vấn đề lớn thành các vấn đề nhỏ hơn để dễ quản lý.
Đúng vậy, đối với lập trình viên, khi nhận nhiệm vụ phát triển phần mềm, họ không bắt đầu viết mã ngay lập tức. Họ thường bắt đầu bằng việc vẽ sơ đồ giải thuật với sơ đồ tư duy hoặc các công cụ khác.
Trên sơ đồ giải thuật đó, họ xác định thuộc tính của vấn đề, cách tiếp cận, khả năng xảy ra và thứ tự ưu tiên của các công việc, rồi sau đó mới xác định các công việc cụ thể ở từng giai đoạn, và cuối cùng mới thực hiện. Việc này vì bắt đầu thực hiện công việc cụ thể chỉ là một phần nhỏ. Còn các câu hỏi về cấu trúc chương trình, khả năng mở rộng và duy trì chương trình mới là những vấn đề lớn. Nếu chúng ta không giải quyết những vấn đề này sớm, hậu quả của những sai lầm này sẽ ngày càng nặng nề. Điều này thường được gọi là nợ kỹ thuật (technical debt).
Tương tự trong cuộc sống hoặc công việc của bạn. Khi đối mặt với vấn đề phức tạp, bạn cần ngồi xuống, lên kế hoạch chi tiết các công việc cần làm, các vấn đề cần giải quyết, thứ tự giải quyết để tiết kiệm thời gian và chi phí, và các phương án dự phòng.
Một ví dụ về nợ kỹ thuật trong cuộc sống:
Bạn chuyển nhà gần nhà người yêu, sau khi chia tay, phải mất nhiều thời gian và công sức để di chuyển hàng hóa. Đây chính là món nợ kỹ thuật vì đã đưa ra quyết định không phù hợp trong việc chọn vị trí thuê nhà.
Và cũng như trong lập trình, bạn càng tỉnh táo và khéo léo khi đưa ra các quyết định ban đầu, kết quả sau càng chuẩn xác và đúng tiến độ.
2. Loại bỏ cảm tính
Công cụ chia nhỏ vấn đề không chỉ dừng lại ở mô hình flowchart.
Trong cuộc sống và công việc, khi đối mặt với hai lựa chọn khác nhau, bạn cảm thấy chúng cân bằng nhau. Mỗi lựa chọn có lợi ích và bất lợi riêng, và bạn không biết làm thế nào để cân nhắc chúng vì chúng không có cùng một đơn vị đo và hệ quy chiếu.
Nhưng không cần thiết phải cảm tính đến vậy. Chúng ta có thể chia nhỏ vấn đề cảm tính lớn ra thành các vấn đề cảm tính nhỏ hơn.
Một ví dụ cụ thể:
Bạn đang đối diện với hai lựa chọn về sự nghiệp. Một là tiếp tục làm việc cho công ty A - công ty hiện tại của bạn, và hai là chuyển sang công ty B làm việc. Cả hai lựa chọn đều có ưu và nhược điểm riêng. Làm thế nào để bạn có thể đưa ra quyết định?
Tại đây, bạn cần lập danh sách tất cả các ưu và nhược điểm của từng lựa chọn đối với bản thân mình. Và giả sử bạn có một số điểm như sau:
Công ty A
Ưu điểm
- Sếp là chuyên gia với nhiều năm kinh nghiệm trong ngành.
- Được sếp hứa sẽ đào tạo trực tiếp nếu ở lại.
- Môi trường làm việc trẻ trung, vui vẻ và thoải mái. Đồng nghiệp rất hợp tác.
- Thời gian di chuyển đến công ty mỗi sáng là 15 phút.
Nhược điểm
- Lương thấp hơn khoảng 20% so với nhu cầu sinh hoạt.
- Có thông tin cho rằng lời hứa của sếp là không thực sự đáng tin cậy.
- Áp lực công việc sẽ rất lớn nếu như sếp không thể thực hiện được lời hứa training, và mình sẽ mất thêm ít nhất là 3-6 tháng nữa mới có thể thấy được kết quả cho quyết định của mình nếu ở lại. Và cơ hội sang bên công ty B sẽ khép lại chỉ trong vòng khoảng 1 tháng nữa.
Công ty B
Có lợi
- Chắc chắn sẽ được training trực tiếp vì công ty B đã xây dựng xong quy trình training rất quy củ, mặc dù người train không có nhiều kinh nghiệm bằng sếp bên công ty A.
- Mức lương cao hơn 20% so với nhu cầu sinh hoạt.
- Sản phẩm của công ty này phù hợp với tiêu chuẩn đạo đức của bạn hơn so với sản phẩm của công ty A.
- Địa điểm công ty rất gần với chỗ làm của người yêu bạn và bạn có thể dành thời gian đi ăn cùng nhau vào buổi trưa.
Bất lợi
- Vì là công ty lớn nên môi trường làm việc rất khắt khe, yêu cầu nhân viên phải mặc đồng phục vào Thứ Hai và Thứ Sáu. Nếu đến muộn quá 15 phút vào buổi sáng, bạn sẽ mất luôn chấm công của sáng hôm đó. Ngoài ra còn có khả năng bạn sẽ phải quan tâm đến chính trị chốn văn phòng.
- Thời gian di chuyển đến công ty mỗi sáng là 35 phút, lại đi qua một đoạn đường rất bụi và không có cây xanh.
Sau khi đã có được danh sách tất cả các điểm ưu và điểm nhược của từng lựa chọn mà bạn có thể nghĩ ra được như trên, bạn tiến hành tính điểm cho từng đầu mục dựa trên giá trị ưu tiên của cá nhân bạn (hay nói cách khác là cảm tính) trên thang điểm từ -5 đến 5 (hoặc cũng có thể là một thang điểm nào đó khác như -7 đến 7 hay -10 đến 10, miễn là thang điểm này có tâm tại 0; cá nhân tôi cho rằng thang điểm -5 đến 5 là hợp lý nhất). Các điểm có lợi sẽ là điểm số dương, và các điểm bất lợi sẽ là điểm số âm.
Sau khi đã thu về kết quả tổng điểm, bạn có thể thấy lựa chọn công ty B có sức nặng hơn lựa chọn công ty A là 2 điểm, và do đó có lẽ bạn nên lựa chọn công ty B. Hai điểm là một con số không lớn, mà nếu bạn không chia nhỏ các đầu mục của mỗi lựa chọn ra và đưa chúng trở về cùng một hệ quy chiếu là thang điểm từ -5 đến 5, thì bạn sẽ khó lòng có thể nhận ra được sự khác biệt rất nhỏ này. Mặc dù về bản chất, các con số này cũng đều mang tính cảm tính và không thể chuẩn xác 100%, nhưng chí ít là chúng tỏ ra rõ ràng hơn là hai lựa chọn đơn sơ giữa công ty A và công ty B ban đầu.
Thế nhỡ tính xong rồi mà rốt cuộc vẫn sai thì sao?
…..
