Kỹ năng quan trọng nhất của một Developer

imagine

Photo Credit: By Preethi Kasireddy from Medium

Là 1 người tự học hiệu quả là yếu tố quan trọng tối thiểu để trở thành 1 coder giỏi

Khi bạn là 1 developer, công việc của bạn yêu cầu bạn phải học hỏi hàng ngày - bất kể có rất nhiều thứ khác lôi cuốn hơn và khiến bạn bị sao nhãng như Hacker News, Twitter, Reddit hay Facebook.

Tại nơi làm việc thì bạn liên tục phải đụng độ với những dòng code và những thử thách mới về công nghệ. Ở nhà cũng chẳng tốt hơn là mấy, như việc bạn phải giải quyết những đoạn mã nguồn mở hay là các dự án cá nhân của mình, rồi những quy trình và các thách thức riêng,…

Thế giới công nghệ luôn thay đổi rất nhanh, và cảm tưởng như 1 công việc full-tim sẽ chỉ theo kịp với những công cụ, ngôn ngữ và frameworks cũ nhất thôi.

Nói tóm lại: Học tập luôn là một quá trình khó khăn. Nhưng bây giờ, ngòai liên tục học hỏi chúng ta còn cần phải có khả năng học nhanh và hiệu quả thì mới có thể theo kịp xu hướng công nghệ và phát triển được.

Trong những năm vừa qua, tôi đã từ gã không biết cách sử dụng Chrome debugger đến tầm có thể làm việc như một kỹ sư phần mềm cho 1 công ty tiền điện tử hàng đầu. Trong giai đoạn này, tôi đã học được 1 kỹ năng mới rất nhanh chóng - đó là coding.

Tôi thấy rằng, việc học thực sự không dễ đối với tôi.

Thưc lòng mà nói, mọi khái niệm mới luôn là 1 trở ngại. Có quá nhiều thứ mà tôi không biết, cũng như bao la ngút trời thứ mà tôi không dám chắc chắn.

“Tại sao cái này lại đúng, ai chứng minh được nó?” Tôi nghĩ trong đầu
“Nếu đây là cách để học code hàng ngày, tôi sẽ thực sự khốn khổ đây. Thực ra đây có phải là đam mê của tôi không?”
“Và sẽ không thực sự dễ với tôi nếu nó không phải là đam mê của tôi? Các nghệ sĩ có gặp phải khó khăn trong quá trình hiện thực hóa các tác phẩm nghệ thuật của mình không nhỉ? Các nhà văn thì sao, họ cũng sẽ có những lúc bí bách khi không nghĩ ra ý tưởng mới chứ? Hay các vận động viên cũng thế, liệu học có bị những chấn thương ảnh hưởng để thi đấu tốt hơn trên đường chạy của họ? Chúng ta có phải đấu tranh để theo đuổi đam mê của mình không?
“Tôi sẽ không tìm thấy sự thích thú trong việc này?”

Liệu việc học này sẽ trở nên dễ dàng hơn 1 tí?

Có, chắc chắn như vậy. 1 năm sau, khi đang phải xử lý 1 khái niệm mới về lập trình mà nó vẫn thực sư rất “khó nhai” và yêu cầu tính kỷ luật cũng như sự chăm chỉ cao trong công việc thì nó bỗng trở thành một quá trình rất thú vị, thay vì là 1 thứ gì đó nặng nề.

Vậy bí mật là gì để từ 1 quá trình “khó nhai” trở nên thú vị như vậy?

Rất đơn giản: Tôi thay đổi quan điểm của mình trong việc học. Và ngay khi tôi gặp khó khăn nó sẽ chuyển từ “khó nhai” thành ngay “hấp dẫn”…

Trong phần còn lại của bài viết này, tôi sẽ giải thích sự thay đổi này diễn ra ra sao.

Hãy bắt đầu

Thời gian đầu học code chính là giai đoạn khó nhất.

Ví dụ, bạn hãy nghĩ về ngôn ngữ lập trình đầu tiên mà bạn phải học. Trước khi bạn muốn giải quyết 1 vấn đề nho nhỏ ví dụ như cú phápstyle code thì đầu tiên, bạn phải hiểu các khái niệm cốt lõi khó như values, types, operators, control flow, function, higher order function, scopes, closures, recursion và rất nhiều nữa.

(It feels like learning to juggle — but starting with eighteen pins instead of two.)

Khi lần đầu tiên tôi học về closures, tôi thực sự đã mất vài tuần để thực sự hiểu được khái niệm này. Tôi nghĩ mình đã hiểu hết khi đọc nó. Nhưng khi thử nhận diện và sử dụng closures trong lúc thực hành, hóa ra lại thật sự rất khó khăn.

Đó không phải là điều bất thường khi bạn học code. Tôi đã quan sát quá trình này trên phương diện 1 giáo viên: chúng ta không thực sự hiểu rõ và dùng các khái niệm mới ngay lần đầu tiên. Hoặc lần thứ 2. Và kể cả đến lần thứ 10 đi nữa.

Nhưng đối với những người gặm nhấm những vấn đề đó đủ lầu, 1 thời điểm nào trong tương lai mà ở đó sẽ có 1 bước ngoặt nơi mà mọi thứ bắt đầu dễ hiểu hơn và chúng ta bắt đầu control được những khái niệm mới khó nhai này. Trong trường hơp của tôi, tôi đã đọc kỹ từng chữ 1 tất cả các blog, các bài viết trên Stack Overflow, hay trên internet về vấn đề của mình - closure.

Tất cả mọi thứ tôi đọc và làm thí nghiệm đã cho tôi những góc nhìn mới, cho đến cuối cùng, tôi đã 1 bức tranh toàn cảnh 360 độ về cái cách mà closures làm việc như thế nào. Và đó là lúc tôi đã thực sự control được closures

Chạm tới 1 điểm mà ta thực sự hiểu về closures là rất rất quan trọng, vì nó như 1 phần thưởng cho bao công sức tôi đã bỏ ra dùi mài kinh sử và phần thưởng đó đã động viên tôi để có thể đi xa hơn - bao gồm cả việc viết 1 bài đăng blog để giải thích riêng khái niệm này

Học là 1 quá trình, không phải là 1 điểm đến

Nếu chúng ta xem việc học như là 1 việc phải làm, chúng ta sẽ chỉ cố gắng nhanh chóng muốn học cho xong và để dành thời gian làm những việc khác thú vị hơn - những việc mà ta muốn làm.

Vấn đề là nó chúng ta sẽ không thể nào biết được mọi thứ trên thế giới này, vì vậy nếu xem việc học như 1 cuộc đua nó sẽ chỉ dẫn ta đến mức kiệt sứcthất vọng.

Thay vào đó, nếu bạn xem việc học như 1 quá trình, bạn sẽ đánh giá cao những chiến thắng nhỏ này và hiểu rõ được chúng dọc trên con đường mà bạn đang đi. Và nó sẽ giúp bạn tiếp tục tiến về phía trước.

Bạn có thể so sánh nó với việc tập thể dục. Khi tập thể dục, nó sẽ khiến ta đau và mỏi nhừ các cơ trên cơ thể, những cơn đau này sẽ chỉ biến mất sau khi mà chúng ta không tập nữa. Nhưng nó không biến mất hoàn toàn. Nó sẽ chờ và xuất hiện cho tới lần ta tập tiếp theo. Ngoại trừ mỗi lần như vậy, những cơn đau sẽ bắt đầu bớt đau nhói và khó chịu hơn. Và rồi bạn sẽ học được cách đương đầu với nó. Bạn sẽ trở nên quen hơn với những cơn đau, và cuối cùng những cơn đau sẽ trở thành 1 phần nhỏ của quá trình. Cuối cùng phần thưởng bạn nhận được đó chính là sức khỏe và 1 cơ thể săn chắc, khỏe mạnh hơn, và đó sẽ là động lực để bạn tiếp tục
Tập thể dục thường xuyên tạo ra 1 vòng phản hổi rất tích cực như sau:

exercise - picture

Photo Credit: By Preethi Kasireddy from Medium

Qúa trình học tập cũng tương tự như vậy

Khiến qúa trình học tập trở nên hấp dẫn hơn

Tưởng tượng bạn đang build một ứng dụng web đầu tiên của riêng mình

Đầu tiên, tất cả những thứ thứ bạn đang có chỉ là những trang editor trống. Và việc tự build ứng dụng này dường như phần lớn là không thể. Bạn chẳng biết một tí gì và có rất nhiều thứ phải học trước khi bạn có thể tự build nó.

May mắn là, dù sao thì bạn cũng quyết định phải làm bằng được.

Sau khi hạ quyết tâm, bạn tập trung và đi từng bước nhỏ chút một.

Việc đầu tiên, bạn phải lên ý tưởng. Mình sẽ build thứ gì? Đối tượng người dùng cuối cùng - họ là ai? Có gì ràng buộc ý tưởng này không?

Thứ hai, bạn phải phác thảo ra một vài các thiết kế để ta có thể tưởng tượng khái quát trong đầu thứ mà ta đang build sẽ nhìn như thế nào. Sau đó hỏi bạn bè hoặc là đưa lên mạng để mọi người có thể feedback và ta dựa vào những phản hồi đó để khiến những thiết kế thô sơ ban đầu trở nên đẹp hơn.

Thứ ba, bạn nghiên sẽ phải nghiên cứu các languages, tools, frameworks mà chúng có thể phối hợp và đáp ứng tốt nhất các yêu cầu với app của bạn.

Từng bước một bạn phải rèn luyện tâm trí của mình để chuyển hóa toàn bộ năng lượng hướng về phía trước và nhắm tới chỉ một mục tiêu duy nhất - đó chính là hoàn thành đứa con của mình.

Sẽ có những thời điểm bạn cảm thấy cực kì mệt mỏi và chán nản vì phải làm tất cả những việc này, đừng nản chí, tạm dừng lại và cho bản thân những giây phút nghỉ ngơi.

Rồi những lúc khác, bạn lại cảm thấy không thích viết code nữa. Việc đó không có gì là lạ. Điều nên làm lúc đó là bạn nên dành thời gian để nghiên cứu và đọc những topic liên quan đến project của bạn.

Cuối cùng , sau một vài tuần làm việc chăm chỉ, bạn đã build được cái gọi là nền tảng mà có thể giải quyết tất cả các vấn đề khác lớn hơn sau này. Đột nhiên, làm việc với app của bạn tự nhiên sẽ không cảm thấy những mệt mỏi, chán nản chút nào nữa. Bạn đã thấy những thành tự đầu tiên của sau những tháng ngày dày công mòn đít trước màn hình máy tính để code và nghiên cứu. Và bây giờ, những việc khác cũng chỉ là những phần nhỏ trong quá trình code của bạn thôi, bạn sẽ viết một vài dòng code khác hoặc tái cấu trúc lại những đoạn code mà bạn đã code trước đó - việc mà bạn đã làm cả trăm lần rồi, không vấn đề gì cả.

Bạn đã chuyển cái mà ban đầu ta chỉ thấy sợ hãi, nản lòng, thô sơ thành một thứ phức tạphấp dẫn hơn.

Đó là cách mà chúng ta đã tiến bộ. Đó là cách chúng ta trở nên tốt hơn. Bất kể đó là công việc lập trình, khiêu vũ, điền kinh hay việc đọc: nó không dễ dàng, và nó sẽ chẳng bao giở xảy ra vào một lúc nào đó khi mà bạn dừng học hỏi.

Thay vào đó, hãy yêu thích cái quá trình đầu tư năng lượng của bạn vào một thứ gì đó, tập yêu thích những nỗi đau mà nó đi cùng. Bạn sẽ bắt đầu nhận ra nó không còn được miêu tả chỉ bằng từ đau nữa - bởi vì những gì từng là đau đớn sẽ trở thành một biểu tượng cho những điều sau: thứ cảm giác hoàn toàn tự hào sau khi hoàn thành các công việc khó khăn của mình.

Nói cách khác, những trắc trở, khó khănvà niềm yêu thích bắt đầu có ý nghĩa giống nhau và trở thành một. Hãy ghi nhớ cái chu kỳ này:

exercise - picture

Photo Credit: By Preethi Kasireddy from Medium

Cách tiếp cận với mảng kỹ thuật

Để tôi tiết lộ với bạn một chút về quá trình học mà tôi đang theo. Đó không phải một phong cách học gọi là be-all-end-all, nếu có những cách khác mà rất hiệu quả với bạn, hãy chia sẽ ở phần comments nhé! Trong trường hợp bạn không thể nói, tôi là chuyên gia trong lĩnh vực này :)

Hãy lấy quá trình học React.js library làm ví dụ.

Đâu là động lực để ta học thứ này?

Bước đầu, tôi sẽ bắt đầu search Google để tìm tài liệu về React.js và đọc một ít về background cũng như là động lực để bắt đầu học thư viện này.

Biết được câu hỏi tại sao đằng sau mọi vấn đề là một yếu tố cực kỳ hữu ích và quan trọng để tạo nên bộ khung sườn cho quá trình học của mình, nó trả lời cho các câu hỏi như sau:

  • Điểm khác biệt giữa các thư viện này là gì ( cụ thể ở đây là React.js library )
  • Nó hữu ích thế nào với project của ta
  • Những vấn đề nào mà React có thể giải quyết
  • Đây sẽ chỉ là một công cụ mới có ích với ta trong một vài tháng hay nó sẽ gây một ảnh hưởng lớn tới cách ta nghĩ khi code?

Đọc hiểu những khái niệm chính

Thứ hai, tôi sẽ đọc qua mọi bài báo hay những ví dụ có trong tài liệu.

Bạn có nhận ra rằng tôi chưa gõ một dòng code nào ở đây không? Đúng, hãy đọchiểu những khái niệm chính trước khi mà ta bắt đầu thực hành. Việc này cực kỳ quan trọng vì nó đặt nền tảng cho toàn bộ quá trình học tập của tôi sau này.

Kể cả khi không đọc những tài liệu liên quan đến ReactJs này, tôi cũng không mù mờ đến nỗi không biết cách sử dụng nó nhưng cuối cùng, thì tôi cũng sẽ phải làm việc này khi gặp bug trong quá trình code thôi.

Thời gian code đầu tiên

Sau khi dành thời gian cho những bước trên, và bắt đầu hiểu tại sao tôi nên học thư viện này, hoặc có thể cảm thấy như tôi đã hoàn toàn hiểu được hết. Lúc này mới là thời điểm để code vài dòng đầu tiên đây.

Khi bạn bị chững lại

… Và sau đó, một điều không thể tránh khỏi, tôi đã bị kẹt lại.

Đọc tài liệu xem như là một phần của quá trình, nhưng thực ra việc áp dụng nó vào thực tế khiến tôi nhận ra mình đang chẳng biết chuyện gì đang diễn ra nữa.

Đó là khi tôi bắt đầu cảm thấy sợ cái cảm giác bỏ cuộc. Nhưng thay vì bỏ cuộc trong lúc mọi chuyện đang rất khó khăn này, tôi tự nhủ với bản thân là pain == gain. Quay trở lại sẽ thật nhát gan.

Đây là những việc mà tôi làm thay vào đó:

  1. Đầu tiên tôi thu hẹp và tìm ra vấn đề đang khiến tôi bị kẹt lại - xác định vấn đề. Sau đó tôi đưa ra giả thuyết những nguyên nhân có thể là gốc rễ của vấn đề hay là có khả năng gây ra vấn đề này. Kể cả khi không có chút manh mối nào, tôi cũng sẽ thử đoán.

  2. Bước tiếp theo là mặc kệ, nhấc mông ra khỏi ghế trước màn hình máy tính và làm những việc thư giãn cho bản thân. Tôi biết bước này thực sự thực sự khó khi ta đang rất buồn với vấn đề mà ta đang bị kẹt, nhưng việc mặc kệ chúng có khi lại hiệu quả. ( Có bao giờ bạn nhận ra những ý tưởng tuyệt vời thường này ra trong lúc ta đang tắm không? :D )

  3. Bây giờ tôi cố gắng debug với những giả thuyết trong đầu mình. Tôi cố gắng đi xa hết sức có thể với những giả thuyết của mình mà không tìm kiếm các câu trả lời online - thường thường sẽ có vài điều tốt đẹp xảy ra khi bạn cố gắng giải quyết những vấn đề này bằng cách tự mình thực sự suy nghĩ sâu về nó, trong giai đoạn đầu tiên. Kể cả khi bạn đi nhầm đường, thực tế chỉ ra rằng việc bạn tạo ra nhiều nỗ lực như vậy sẽ dạy bạn rất nhiều và bạn sẽ nhớ vấn đề tốt hơn nếu lần sau bạn gặp phải nó.

  4. Nếu giả thuyết của tôi đưa tôi đến câu trả lời, hu-ra! Tôi đã xong. Nếu không, tôi google để tìm các tài liệu, bài blog, hay những bài đăng trên Stack Overflow mà có thể giúp tôi đến gần hơn với câu trả lời.

  5. Trong khi đọc, tôi ghi lại mọi thông tin tiềm tàng có thể giúp tôi trong quá trình tìm ra câu trả lời.

  6. Vẫn không có giải pháp? Không sao. Tôi đảm bảo tôi đã học được vài điều rất giá trị bằng việc đọc qua toàn bộ những tài liệu này, kể cả khi nó không trực tiếp giúp tôi giải quyết vấn đề lúc bây giờ. Ai biết khi mà những kiến thức đó có thể sẽ hữu ích khi gặp những bug khác trong tương lai?

  7. Đến điểm này, tôi thực sự bị kẹt lại rồi, tôi sẽ không đăng câu hỏi lên Stack Overflow hay hỏi các đồng nghiệp và những developer mà tôi biết nữa.

  8. Thay vào đó, tôi sẽ làm lại và lặp lại các bước trên cho đến khi tôi tiến gần đến giải pháp cuối cùng hơn. Vào những lúc nào đó, câu trả lời luôn luôn đến.

Có một vài giai đoạn mà quá trình này sẽ chỉ mất vài giây, nhưng có những lúc nó sẽ lấy đi của ta hàng giờ đồng hồ ( thậm chí là nhiều ngày liền ). Dù bằng cách nào, tự quá trình này bản thân nó cũng cực kỳ có lợi cho những kỹ năng để trở thành một developer của bạn.

Bị kẹt lại với một con bug cảm giác như đi vào một đường hầm tối thui và kiếm tìm 1 tia sáng mặt trời vậy. Cuối cùng bạn cũng sẽ tìm ra nó, nhưng theo cách mà bạn phải khám phá rất nhiều về đường hầm này - đó chính là kiến thức về “đường hầm” và nó khiến bạn trở nên mạnh mẽ hơn như một coder.

Suy nghĩ về việc debugging giống như một cơ hội để ta khám phá thay vì một đường vòng để đạt được mục tiêu của mình một cách nhanh chóng, nó sẽ trở nên thú vị hơn nhiều.

Luyện tập

Vậy là đến thời điểm này, tôi đã build được vài thứ gì đó nho nhỏ cũng như giải quyết được một vài trở ngại nhỏ gặp phải trên đường đi . Và bạn có thể thấy, nó như một cuộc chiến vậy - rõ ràng, tôi cần phải luyện tập nhiều hơn với công cụ mới này.

Vì thế, một lần nữa tôi thử tự build vài thứ hay ho bằng chính sức mình. Thay vì nhảy thẳng tới một dự án lớn ngay lập tức, tôi sẽ tìm một repo rồi setup ứng dụng của mình.

Ví dụ, nếu có một ứng dụng CRUD todo app dùng thư viện ReactJs, có thể tôi sẽ build một ứng dụng CRUD khác. Đủ khác để làm tôi thấy hứng thú, nhưng sẽ không khác đến mức khiến tôi thấy nản lòng nếu gặp vấn đề nào đó không ổn.

Giải thích: CRUD = Create, Retrieve, Update, Delete là 4 chức năng cơ bản của một ứng dụng đơn giản (Tạo dữ liệu, Lấy và hiển thị dữ liệu, Thay đổi dữ liệu, Xoá dữ liệu). Ví dụ như một app quản lý sinh viên, người dùng sẽ cần Tạo sinh viên mới, Hiển thị danh sách sinh viên, Thay đổi dữ liệu của 1 sinh viên, Xoá 1 sinh viên.

Sự tinh thông

Độ tinh thông yêu cầu ta phải lặp đi lặp lại nếu muốn làm chủ nó, vì thế tôi tiếp tục build những dự án nhỏ thôi cho đến khi cảm thấy tự tin rằng mình đã hiểu được những vấn đề cốt lõi.

Cuối cùng khi tôi có thể tự mình làm vài thứ nhỏ mà không cần phải tra cứu tài liệu hay các ví dụ nữa. Chỉ khi đến lúc đó tôi mới dám mạo hiểm và tự build thứ gì đó từ đầu.

Trong quá trình này, tôi cố gắng khiến nó trở nên thật thú vị và hấp dẫn hơn. Tôi liên tục thúc đẩy bản thân mình làm việc chăm chỉ hết mức có thể, nhưng không để bản thân mình ăn ngủ với nó nhiều quá nếu không sẽ dễ khiến tôi thấy nản và khó có thể hoàn thành được.

Cuối cùng, đảm bảo rằng tôi sẽ dừng lại và không làm nó nữa ngay khi tôi thấy bản thân trở nên khó chịu và bực bội để có thể tiếp tục làm project này.

Việc học thực sự rất thú vị

Nếu ta có một kế hoạch học tập rõ ràng cộng với những nỗ lực cố gắng của ta, học lập trình hóa ra lại thực sự rất thú vị. Giai đoạn đầu tiên, học lập trình thực sự rất phức tạp, và theo quan điểm của tôi đó là lý do vì sao rất nhiều người sợ việc này, không chỉ là rất tẻ nhạt mà thực sự còn rất khó nữa.

Nhưng sau khi trải qua sự tẻ nhạt và những vấn đề khó nhằn này một vài lần, quá trình học những thứ mới sẽ không còn thực sự làm khó bạn nữa. Bạn không cần thực sự nghĩ về nó nhiều đâu, chỉ cần học cách vượt qua những nỗi đau này và bạn sẽ tìm thấy niềm vui ở những thành công bạn đạt được sau này.

Source: https://medium.freecodecamp.org/learning-how-to-learn-the-most-important-developer-skill-7bf62dfaf67d