"Hành trình từ newbie trở thành Software Engineer trong 9 tháng"
Bài đăng này đã không được cập nhật trong 5 năm
Đây là bài dịch, nếu muốn mọi người hãy xem bài gốc tại đây.
Mở đầu
Làm thế nào tôi có thể từ newbie trở thành Software Engineer trong vòng 9 tháng, trong khi vẫn làm việc full-time?!?
Trong bài viết này tôi sẽ chia sẻ cách mà tôi đã từ một tay mơ trở thành một "kỹ xư" phần mềm với mức lương 6 chữ số (100000$) bằng cách tự học trong khi vẫn duy trì một công việc full-time không hề liên quan
Mỗi khi mà tôi đọc một "Câu chuyện thành công" nào đó, tôi thường bắt đầu với việc xem xem background của người viết đó có thực sự matching với bản thân mình không. Tôi chưa tìm được ai đó giống hệt mình, cũng như suy nghĩ của tôi cũng sẽ không hoàn toàn giống với các bạn. Tuy nhiên tôi mong rằng câu chuyện của tôi có thể "truyền cảm hứng" hay chí ít là nó mang lại 1 giá trị nhất định có ích cho bạn trong câu chuyện thành công của riêng mình.
Giới thiệu bản thân (Background)
Tôi có tham gia 1 khóa Visual Basic for Application từ 9 năm trước, hồi cấp 3 (gần giống Visual Basic, đại loại là dùng để lập trình một số program nhỏ hoạt động cùng với các application của Microsoft). Trong khóa học cơ bản về engineer thì tôi có học một chút về C, Python, Matlab và Labview (7 năm trước). Tôi tốt nghiệp một trường đại học khá tốt với tấm bằng Kỹ sư hóa học và một bảng điểm không hề tồi (đó đã là 3 năm trước). Ngoài từng đó ra thì tôi chưa code ciếc gì cả. Cho đến khi mà tôi quyết định là tôi sẽ học về nó, vào năm ngoái.
Sau đại học tôi làm công việc của một Kỹ sư vận hành trong một xưởng. Và tôi làm ở đó cho đến lúc tôi chuyển sang làm một Software Engineer.
Lí do nào khiến tôi muốn thay đổi
Tôi vẫn đang enjoy việc giải quyết những vấn đề về technical ở công việc hiện tại, tuy nhiên, bản thân tôi hiểu rằng mình muốn dấn thân vào thế giới của các start-up đang nở rộ ngoài kia. Tôi luôn có suy nghĩ về việc lấy một tấm bằng MBA nhưng mỗi lần nhìn học phí của khóa học, hứng thú của tôi cứ đi đâu mất hết
Vào 27/5/2017, một lần nữa tôi thấy mình đang google về MBA. Và bằng cách nào đó thì lần này nó là tấm bằng về kỹ sư phần mềm. Đó dường như là một sự hoàn hảo được sắp đặt sẵn vậy. Software Engineer (SE) là một ngành đang có nhu cầu rất lớn, mức lương thì khỏi phải bàn, và hơn nữa nó là một ngành mà bạn có thể làm start-up mà không cần có 1 số vốn quá khổng lồ. Tất cả những gì bạn cần là một chiếc máy tính và những cơ hội là vô hạn (hay gần như vậy )
Không có ngành kỹ thuật nào khác mà bạn có thể chỉ cần bắt đầu với 1 ý tưởng, thực hiện nó, show nó cho người dùng và thực hiện hóa nó với một số vốn khởi điểm rất nhỏ và hầu như không có quá nhiều sự hạn chế, khó khăn từ các phía khác (chính phủ,..). Ví dụ như trong ngành hóa học mà tôi đang làm, bạn sẽ cần có một nhà máy đang hoạt động, hoặc là bạn sẽ cần rất, rất nhiều tiền để có thể bắt đầu xây dựng nếu xuất phát điểm của bạn chỉ là ý tưởng về một sản phẩm mới.
Tôi có nghe mọi người nói về việc họ nghỉ việc và tham gia các buổi boot-camp, nhưng càng nghiên cứu, càng đọc nhiều hơn qua mạng, tôi nhận ra rằng bạn hoàn toàn có thể tự học nếu như bạn thực sự muốn và tập trung vào nó.
Sẽ có những sự tranh cãi là nếu bạn tự học thì bạn sẽ bỏ lỡ những cơ hội cho những mối quan hệ hay những lời khuyên rất giá trị từ những buổi bootcamp đó. Điều đó đúng, nhưng thật may mắn cho tôi, đó là tôi sống ở Bay Area, một nơi mà thường xuyên có những buổi meetups về công nghệ, và tôi có được các mối quan hệ theo cách đó.
Dù sao thì tôi cũng vạch sẵn một worst-case-scenario (trường hợp xấu nhất) đó là tôi sẽ không tự học được, nếu vậy tôi sẽ nghỉ việc và tham gia bootcamp.
Mục tiêu
Bạn cần phải có mục tiêu. Nhất là khi bạn quyết định rằng mình sẽ vừa học vừa duy trì một công việc hiện tại. Nó sẽ dễ dàng hơn để bạn có thể thoải mái nhất để nghiên cứu nếu như không bị ảnh hưởng bởi các yếu tố bên ngoài. Ngược lại, bạn phải tạo ra áp lực từ bên trong. Đó là mục tiêu. Những mục tiêu của bạn nên đơn giản và được định lượng tốt. Nó có nghĩa là bạn nên nghiên cứu một chút để có thể có những mục tiêu thiết thực, hợp lí nhất với mình. Ví dụ như của tôi:
Kiếm được một công việc về SE trong vòng 1 năm với mức lương bằng hoặc hơn công việc hiện tại.
Kế hoạch
Một khi đã có mục tiêu, bạn cần có thêm một kế hoạch cụ thể để giúp bạn hoàn thành nó. Đây là thời điểm mà bạn nên đọc nhiều về các câu chuyện thành công từ những người khác. Tất nhiên là không có một cái nào là hoàn toàn phù hợp với tình trạng của bạn hiện tại, nhưng bạn có thể có được nhiều lời khuyên quý báu. Tôi đã lập ra một kế hoạch cho riêng mình thông qua những nguồn như là learn programming, freeCodeCamp, Medium.
Vào 27/5/2017, tôi đã quyết định là mình sẽ bắt đầu code, vì thế, từ ngày hôm đó, tôi đã quyết định rằng mình sẽ không làm việc quá 40h/tuần để có thể có tối đa thời gian sau giờ làm cũng như cuối tuần.
May cho các bạn là tôi đã tổng hợp lại những gì mình đã làm khá là chi tiết đó Đây là bản kế hoạch của tôi, mặc dù trải qua nhiều sự thay đổi, nhưng tóm lại cuối cùng thì nó như thế này đây:
- Học một khóa Intro to CS (Computer Science) để có thể có sự hiểu biết cơ bản về CS.
- Học và làm theo các hướng dẫn trên freeCodeCamp đến khi tôi có một cơ số các applications, phục vụ cho mục đích có một portfolio đạt đến mức full stack web :v
- Refactoring lại code, test, tập trung vào concepts ở mức độ cao hơn.
- Contribute cho các open source project, lib.
- Chuẩn bị để đi phỏng vấn.
Để bắt đầu, kế hoạch của tôi khá đơn giản. Lúc đó tôi đang đi theo hướng dẫn của Google's Technical Guide, nên tôi đã theo học khóa học mà họ recommend, Udacity CS101.
Tháng 0 - Udacity CS101, Harvard CS50
Việc đưa ra một quyết định lớn trong cuộc đời mang lại cho tôi nguồn cảm hứng cũng như năng lương dồi dào. Mỗi ngày tôi có thể bắt đầu code từ khi về nhà cho đến khi leo lên giường đi ngủ. Và cứ như vậy cả tuần liền. Udacity CS101 theo dõi tiến trình học của bạn, và việc theo dõi tiến triển mỗi ngày là một nguồn động lực lớn cho tôi tiếp tục. Như một đứa trẻ dán phiếu bé ngoan nhận được hàng tuần, tôi đã log lại tiến độ của mình lên đó mỗi ngày. Và kết quả là tôi đã hoàn thành 75% khóa học trong vòng 10 ngày. 25% còn lại khá nặng về đệ quy, nó khiến tôi phải vất vả hơn một chút. Cuối cùng thì tôi đã hoàn thành Udacity CS101 trong vòng 20 ngày.
Trong lúc theo học Udacity CS101 thì tôi có bắt đầu "lội" learnprogramming subreddit khá là hard-core. Tôi có đọc được là đối với một người tự học online thì việc build một profile online là rất quan trọng. Vì vậy tôi đã bắt tay vào lập hoàn toàn mới các tài khoản Reddit, Twitter, Stack Overflow, Medium, Quora với tên đầy đủ của mình.
Cùng lúc, tôi quyết định dừng việc xem những thứ gây mất tập trung như FB hay Instagram,.. Tôi chỉ check điện thoại khi có tin tức gì đó liên quan đến programming. Đó là một quyết định vô cùng quan trọng. Nhờ có vậy mà tôi đã tìm thấy Harvard CS50 ở edX.
Tôi vốn chỉ định học 1 khóa intro thôi, nhưng có vẻ mọi người đều recommend về Harvard CS50 nên tôi đã quyết định nó sẽ là thứ tiếp theo tôi sẽ hoàn thành, sau Udacity CS101. Rất nhiều sinh viên Computer Science học khóa này nói rằng họ học được ở đây nhiều hơn là những thứ họ học được trong 1,2 năm trong trường đại học. Mọi người đều nhất trí là nó khá là khó, nhưng đúng là "khó thì mới có thịt chó mà ăn" :v Trong tháng này tôi đã hoàn thành 5 bài giảng và bài tập đầu tiên.
Tháng 1 - Harvard CS50, Linux, Meetups đầu tiên, freeCodeCamp
Tôi hoàn thành CS50 vào giữa tháng, tôi sẽ không nói quá chi tiết về nó, vì đã có 1 bài riêng để chia sẻ trải nghiệm của tôi ở đây.
TL,DR: Nó là một khóa học tuyệt vời. Tôi thực sự khuyên bạn nên học nó. David Malan (giảng viên của khóa học) là một giảng viên tuyệt vời nữa. Bạn sẽ bắt đầu với C, sau đó chuyển sang Python và cuối cùng là web develop. Mặc dù phải thừa nhận là nó khá phức tạp cũng như có cả tấn tài liệu bạn phải đọc, tuy nhiên nó thực sự xứng đáng.
Sau CS50, tôi quyết định cài Ubuntu cho con XPS15 của tôi để dual boot vs Window. Đó là một tuần tồi tệ. Tôi đã "f-ck up" với cái ổ cứng và gần như biến con laptop của mình thành cục gạch. Xém chút nữa là tôi phi nó vào thùng rác rồi đó.
Tôi dần xa rời Window và gần như chỉ dùng mỗi Ubuntu. Tôi muốn ép mình làm quen với việc sử dụng command-line, thứ sẽ giúp tôi trong việc có được một số bằng cấp, chứng nhận, nhưng nó là cả một chặng đường dài.
Tôi đã bắt đầu "100 days of summe.. à nhầm 100 days of code để có thể đảm bảo rằng mình sẽ giữ được sự tập trung và code, evezi dey. Việc ghi chép lại tiến độ của bạn rất quan trọng. Bạn có thể nghĩ rằng việc mỗi ngày tiến triển được thêm một chút là việc gì đó khá là bình thường. Nhưng đến khi mà bạn nhìn lại quá trình 1 tháng, thậm chí là nhiều tháng, bạn sẽ thấy rằng, "à, mình cũng đã tiến bộ được đáng kể rồi đó chứ' và nó sẽ giúp bạn có thêm động lực để tiếp tục.
Tôi biết là ngoài kiến thức thì việc tạo dựng các mối quan hệ (networking) là rất quan trọng để phục vụ cho mục đích tìm việc, phát triển sau này. Thế nên tôi đã phải cố gắng lấy hết can đảm để đi tới buổi meetups đầu tiên trong cuộc đời. Tôi đã rất lo lắng khi lái xe đến đó, đỗ xe, đi đến cửa. Xém chút nữa thôi là tôi đã quay lại và chuồn về
Có một chút động viên nho nhỏ là đó cũng là buổi meetups đầu tiên của nhóm. Nghĩa là mọi người chưa ai biết ai, không có ai phán xét ai, mọi người đều rất hiếu học. Nó là bắt đầu cho một chuỗi những buổi meetups tiếp theo của nhóm này. Cuối cùng thì tôi đã tham gia hơn 50 buổi meetups trong quãng thời gian 9 tháng này.
Thật may là tôi đã quyết định tham gia meetups sớm. Hầu hết mọi người bắt đầu tham gia meetups khi họ có nhu cầu tìm kiếm một công việc. Nhưng đến tận lúc đó thì nó đã là hơi muộn một chút. Tu lệt! Có cả tá lí do mà bạn nên bắt đầu tham gia các buổi meetups sớm:
- Phát triển một mối quan hệ là một quá trình, nó cần có thời gian. Bắt đầu sớm sẽ giúp bạn có nhiều mối quan hệ hơn, sẽ là nơi bạn có thể nhờ cậy khi tìm việc.
- Nói chuyện với người lạ về programming là một cách tuyệt vời để chuẩn bị cho phỏng vấn.
- Bạn có thể học về frameworks, tools,.. từ những người đi trước. Nó cũng giúp định hướng cho kế hoạch trong tương lai của bạn.
Trong chặng đường của tôi ở giai đoạn này có những thứ khá là mơ hồ. Đó là việc lựa chọn kiểu developer mà tôi muốn hướng đến.
Sau cùng thì tôi đã chọn web developer bởi vì nhu cầu về nó là khá nhiều cũng như có rất nhiều nguồn trên mạng để học hỏi. Giải quyết được câu hỏi đó mới là sự khởi đầu thôi. Vấn đề nảy sinh là phải làm gì tiếp theo. Có lời khuyên rằng ở giai đoạn này thì tôi nên nghĩ về việc code 1 website nào đó. Có người nói rằng tôi nên thử các project trên freeCodeCamp hoặc là The Odin Project.
Chuyện là mấy gã mà tôi quen ở cái meetup hàng tuần thì có biết về Ruby và họ muốn làm một project nho nhỏ vs Ruby. Đó là lí do khiến tôi quyết định tham gia vào The Odin Project. Và tôi đã bỏ ý tưởng đó chỉ sau 2 ngày.
Có một bất lợi cho những người chọn con đường tự học, đó là một thời điểm nào đó, bạn cảm thấy khá chắc về việc mình sẽ chọn phát triển theo hướng nào. Rồi đến ngay hôm sau bạn lại tự hỏi rằng liệu điều đó có thực sự là đúng đắn?
Tôi có đọc được rằng Ruby đang mất dần độ hot. Minh chứng bằng việc thử tìm kiếm các job về Ruby và JavaScript là có thể thấy ngay sự khác biệt. Cuối cùng tôi chọn cách làm theo freeCodeCamp. Thứ làm tôi hơi suy nghĩ đó là freeCodeCamp đưa sẵn cho chúng ta idea về project. Vậy nghĩa là tất cả mọi người học đều có những sản phẩm na ná nhau. Trong khi tôi muốn có những thứ nổi bật hơn để có thể thu hút nhà tuyển dụng. Dù vậy, cuối cùng thì tôi lại thấy rất thích freeCodeCamp, và tôi khuyên các bạn cũng nên dùng nó. Các bạn có thể tìm hiểu thêm về chia sẻ của tôi về freeCodeCamp ở đây.
Tháng 2 - YDKJS, freeCodeCamp Front End, React
Tôi đã bắt đầu đọc You Don't Know JavaScript trong tháng này, bởi vì dường như mọi người đều recommend nó như một cẩm nang để chinh chiến freeCodeCamp. Tôi đã phải đọc đi đọc lại khá nhiều phần vì nó nhiều chữ, rối rắm vãi. Nhưng thực sự thì nó là một thứ rất tốt giúp bạn có thể học về scope, promise và tất cả những thứ hay ho về JavaScript mà bạn nghe về nó suốt và lúc nào cũng "định" học nhưng chẳng bao giờ thực sự làm được, vì nó có vẻ hơn khoai khẳm một chút.
Trong thời gian này tôi đã hoàn thành xong phần front-end ở freeCodeCamp. Việc sử dụng checklist và estimate thời gian cho từng mục tiêu như thôi thúc tôi, khiến tôi có thêm động lực để hoàn thành nhanh hơn. Hơn nữa cũng vì tôi muốn nhanh chóng chuyển sang phần tiếp theo để học về React. Đổi lại thì các project của tôi chỉ được hoàn thành ở mức minimal về styling. Tôi cố gắng hoàn thành nhanh nhất có thể những yêu cầu của project và ... không thêm gì cả.
Nghĩ lại thì đáng lẽ tôi nên tập trung hơn vào việc làm cho project của mình nổi bật hơn. Có lẽ tôi đã học được thêm nhiều thứ hay ho về CSS.
Tiếp theo thì tôi bắt tay tìm hiểu về React.
Tôi đã nghe rất nhiều về nó và đã rất háo hứng để thử. Tuy nhiên lúc đó thì React có một chút vấn đề về giấy phép (thật tốt vì nó đã được giải quyết) và không có nhiều những tutorial tốt để học theo nên nó hơi khó khăn một chút. (Bây giờ thì có vô vàn những tutorial hay mà bạn có thể tìm được dễ dàng)
Tôi đã thử đọc và làm theo docs cũng như tutorial của Facebook, những cũng chẳng thể hiểu hết được. Có lẽ là do tôi chưa hiểu đủ về JavaScript, thế nên tôi đã quay về đọc lại YDNJS, nhưng nó cũng toàn chữ là chữ, đọc mãi cũng chả hiểu được mấy.
Tháng 3 - freeCodeCamp React, CodeClub, freeCodeCamp Back-end
Cuối cùng thì tôi quyết định là tôi sẽ thử làm qua project trên freeCodeCamp để xem nó sẽ đi đến đâu. Nhìn lại thì code như hạch, tuy nhiên tôi đã hiểu về React hơn một chút.
Cái meetup mà tôi tham gia mỗi tuần thì quyết định là họ sẽ làm một project với fullstack JavaScript thay vì Ruby. Và họ quyết định là sẽ làm project về website cho chính nhóm meetup này, CodeClub.Social.
Tôi phụ trách code một phần thẻ dùng React, cũng như một API để user có thể đăng kí cho 3 meetup sắp tới của nhóm. Hơi có một chút khó khăn vì nó sẽ khiến tôi phải rời xa freeCodeCamp một thời gian nhưng dù sao đây cũng là cơ hội tốt mà tôi không thể bỏ qua. Tôi cảm thấy vui vì được làm việc trong một nhóm (tuy nhỏ). Nó cũng giúp tôi học thêm về Git và Github.
Tôi vẫn kịp bắt tay vào phần back-end trên freeCodeCamp vào cuối tháng này.
Tháng 4 - Hoàn thành freeCodeCamp Back End, Yeggle
Tôi đã hoàn thiện các phần về API trên freeCodeCamp nhưng đến phần Image Search Abstration Layer thì tôi đã dần tách khỏi freeCodeCamp. Đó là bởi vì tôi đã rất muốn làm một trang web full stack của riêng mình. Và ngay khi tôi đọc được tiêu đề trên, tôi đã có những ý tưởng của riêng mình. Tôi định làm về một trang lưu random hình ảnh từ imgur, sau đó đưa ra một số image phù hợp với từng user cụ thể. Điều mà mọi người nói quả không sai: Bạn sẽ làm việc chăm chỉ và thành công hơn nếu bạn đang làm việc cho chính ý tưởng của mình.
Khi nó hoàn thành, tôi đã thấy vô cùng tự hào. Tất nhiên là nó trông như shiệt thôi nhưng mà it's worked.
Cùng với việc học thông qua các project ở freeCodeCamp, tôi đã biết được những gì có thể phù hợp với khả năng của bản thân. Ngoài ra thì tôi cũng duy trì việc chạy mỗi ngày để duy trì sức khỏe. Đôi khi tôi nảy ra ý tưởng trong lúc chạy, tôi viết chúng ta khi về tới nhà. Và bằng cách đó tôi đã có 1 list những ý tưởng để thực hiện khi tôi sẵn sàng.
Lúc đó tôi cảm thấy đã đến lúc mình làm những web app full stack tuyệt vời để share cho user và làm đẹp thêm cho portfolio của bản thân.
Bình thường mỗi khi tìm kiếm một nhà hàng, tôi thường dùng Yelp để check qua review, sau đó lại dùng thêm Google Maps để check review ở đó nữa. Tôi chợt nảy ra ý tưởng làm 1 trang để kết hợp, so sánh review của cả 2 bên. Và thế là Yeggle ra đời. Tôi sử dụng Node, Express, React cùng với API từ Yelp và Google Maps. Mặc dù ban đầu có 1 vài khó khăn mà tưởng như tôi không vượt qua được, tuy nhiên cuối cùng thì tôi đã hoàn thành được nó và tôi thấy vô cùng hãnh diện. Tôi đã share nó lên Reddit, và... nobody care (yaoming). Nó giống như một cái tát, nhưng tôi không để nó khiến mình chùn bước.
Tháng 5 - StockIT
Tôi không làm được gì nhiều trong tháng này vì tôi có kế hoạch đi nghỉ mát 2 tuần ở Thái và Nhật
Tuy nhiên tôi vẫn kịp bắt đầu và hoàn thành project tiếp theo của mình. Tôi đọc được khá nhiều về những khó khăn khi apply xin việc của những người tự học code thay vì qua trường lớp. Vì vậy tôi quyết định làm gì đó khác biệt. Tôi nhớ là có thấy 1 game cho người chơi 1 biểu đồ chỉ số thực tế của cổ phiếu Dow Jones, trong đó người chơi sẽ có 1 cơ hội duy nhất mua và 1 cơ hội để bán. Mục tiêu là phải có lãi. Ngược lại mục tiêu của game là làm chỉ ra rằng để kiếm được lãi là điều rất khó.
Ý tưởng về game của riêng tôi cũng khá tương tự cái đó. Nhưng thay vì dùng data realtime thì tôi dùng thuật toán machine learning để đấu trí với người dùng. Và StockIT ra đời.
Tôi xem qua các video hướng dẫn trên Pandas và Scikit Learn để học về các technique (kĩ thuật) khác nhau của machine learning. Ban đầu tôi muốn làm vài thứ thú vị với deep learning, tuy nhiên sau khi nhận ra nó cần tới một bộ dữ liệu khủng cũng như sẽ ngốn kha khá thời gian so với cái mà tôi có thể bỏ ra thì tôi đa chuyển sang sử dụng Linear Regression Model. Tôi đã nghĩ rằng đó sẽ là phần khoai khẳm nhất rồi. Nhưng không, hóa ra phần khó hơn lại là làm sao để React hoạt động trơn tru cùng với D3. Cả 2 đều muốn control DOM. Có một vài lib hỗ trợ để join 2 cái lại với nhau, tuy nhiên tôi cảm thấy nó không ổn định cho lắm. Cuối cùng thì tôi đã dùng D3 để gen ra file SVG và React để xử lí DOM. Và nó hoạt động khá ổn.
Lần này tôi tiếp tục share lên Reddit. Nhưng đoán xem, everyone loved it!
Té ra cũng như VCs (Venture Capitals - nhà đầu tư), redditers cũng chỉ khoái ML. Sự hưởng ứng từ reddit đã giúp tôi có thêm nhiều động lực. Mọi người đã chơi game của tôi, và tuyệt hơn nữa, họ yêu thích nó.
Tháng 6 jobSort(), Job Hunt Prep
Sau StockIT, tôi tiếp tục đến với project tiếp theo của riêng mình. Tôi có ý tưởng về một trang tổng hợp các job từ một số trang thiên về IT như StackOverflow, Github, HackerNews. Để tăng thêm một chút sự đặc trưng, tôi quyết định rằng user có thể lựa chọn các công nghệ mà họ muốn có trong job đó, và có thể chia theo nhiều mức độ khác nhau. Ví dụ như tôi đang tìm một công việc mà yêu cầu người biết về JS, React và Python (optional). Ngược lại tôi là 1 người thích làm về JS & React và không care lắm về Python chẳng hạn. Thì tôi sẽ cho React 3, JS 3 và Python 1 điểm. Dựa vào đó thì hệ thống sẽ đưa ra list các job phù hợp theo thứ tự đó.
Tôi gặp phải ít nhiều vấn đề trong quá trình thực hiện và thậm chí phải thay đổi lại định hướng một vài lần. Tuy nhiên cuối cùng thì tôi cũng đã hoàn thành nó, theo đúng cách mà tôi muốn nó trở thành. Tôi sử dụng React/Node/Express/MySQL. Tôi share nó trên cscareerquestions subreddit và nhận được 650 view trước khi nó bị close vì lí do là họ không cho phép post các project cá nhân trong subreddit này.
Nếu muốn thì bạn có thể check qua nó ở đây, và nếu bạn thấy hứng thú tìm hiểu về những khó khăn mà tôi đã gặp phải cũng như cách giải quyết thì hãy check qua bài viết này nhé.
Vì gặp nhiều vấn đề nên jobSort() đã ngốn gần hết quỹ thời gian của tháng này. Tôi có đi cafe với một người bạn tôi quen ở buổi meetup đầu tiên, và anh ta khuyên tôi nên bắt đầu apply xin việc đi. Tôi đã đọc vô số bài viết rằng là mọi người luôn nói họ đã chờ quá lâu để bắt đầu apply xin việc. Cũng như câu trả lời cho câu hỏi khi nào thích hợp để apply thì luôn là "Ngay bây giờ".
Tôi thì luôn nghĩ rằng tôi sẽ theo sát kế hoạch đề ra, đó là xây dựng một cái portfolio ra trò với các projects rồi tiếp đó là contributions cho các project open source khác. Sau đó mới là chuẩn bị cho phỏng vấn và cuối cùng mới là đi apply job. Người bạn này thì lại bảo tôi là quên kế hoạch đó đi và bắt đầu xin việc ngay và luôn. Vậy là khoảng thời gian còn lại trong tháng tôi đã dành để tút lại portfolio, làm CV để tháng sau mang đi apply.
Tháng 7 - Testing, Job Hunting
Tháng này kế hoạch của tôi là cố gắng tút tát lại các projects của mình và cùng với đó học thêm về mảng Testing và một chút về Redux.
Tôi làm CodeClub.Social có thể reponsive bằng cách thêm thắt cho nó flexbox. Sửa sang lại một chút về jobSort() trên mobile. Tôi cũng thử add thêm mocha/chai/enzyme cho jobSort phục vụ cho việc testing. Mọi chuyện bắt đầu khá đơn giản, nhưng để cover hết 100% thì không ngon ăn chút nào cả.
Cho đến cuối tháng thì tôi đã apply tổng cộng 63 job khác nhau. Tôi coi đó là 1 cơ hội để tự đánh giá lại bản thân. Để xem lại xem portfolio /CV của mình đã đủ tốt hay chưa? Mình cần chuẩn bị thêm những gì. Ban đầu tôi thử apply với các job trên Hacker News: Who is hiring và Indeed.
Trên HackerNew thì tôi dùng jobSort để list ra các job mà tôi có thể apply. Còn ở Indeed thì tôi thử apply vào các công ty non-tech để xem có thể nhận được cuộc gọi hay thậm chí là buổi hẹn phỏng vấn nào không.
Ban đầu thì tôi apply rất chóng vánh mà không chỉnh sửa gì về CV cho phù hợp. Đến giai đoạn tiếp theo thì tôi thử mô-đi-phê nó đi một chút, cùng với gửi email cho 1 vài người trong công ty. Cách tiếp cận này tỏ ra hiệu quả hơn nhiều so với cách "ăn xổi" đầu tiên.
Tổng lại, tôi nhận được 5 cuộc gọi, 2 từ công ty tuyển dụng, 3 từ các công ty phần mềm, trong đó:
- 1 công ty có role riêng cho vai trò DevOps/Testing.
- 1 công ty hạng B về phân tích thực phẩm.
- 1 công ty startup khá thành công và vừa được mua lại bởi 1 tập đoàn lớn.
Tôi vượt qua vòng đầu tiên ở 2 công ty trong số đó nhưng cuối cùng thì không đến được vòng phỏng vấn của công ty nào cả. Dù sao thì việc đạt được một vài cuộc gọi ở giai đoạn đầu tiên cũng là một điều khá ổn rồi, tôi cũng học được nhiều điều từ họ.
Ở trên mạng thì mọi người vẫn luôn nói rằng là với 1 junior thì không cần phải biết tất cả mọi thứ ngay từ đầu, chỉ cần cho thấy được đam mê và sự sẵn sàng học hỏi. Lúc đó tôi nghĩ rằng, như thế thì quá đơn giản, tưởng gì chứ đam mê và hiếu học thì tôi có thừa. Và những điều mà tôi học được từ lần vừa rồi đó là: Chẳng ai đi thuê 1 junior dev cả. Ai cũng muốn tuyển 1 người mà có thể làm được việc ngay từ đầu (yaoming). Tóm lại, điều tôi rút ra được:
- hãy cố gắng để có thể đủ khả năng mang lại giá trị cho công ty ngay lập tức. Và
- hãy tự tin để thuyết phục nhà tuyển dụng rằng bạn có thể mang lại giá trị ngay lập tức.
Month 8 - Ca đêm, Redux, Open Source, Phỏng vấn
Tháng này bắt đầu chuỗi 40 ngày liên tục làm ca đêm của tôi, 12h một ngày, 6 ngày một tuần, từ 5h tối đến 5h sáng.
Tôi biết rằng tháng này sẽ không làm được nhiều như những tháng trước, nhưng tôi đã đặt ra mục tiêu, và tôi sẽ đạt được nó.
Tôi bắt tay với việv refactoring lại jobSort.tech để sử dụng Redux, nó cũng không khó khăn như tôi đã tưởng tượng. Trước đây tôi có nghe nhiều trên radio và đọc khá nhiều blog nhưng mà cảm thấy cái Redux này nghe chả hợp lí tẹo nào. Cho đến khi bắt tay vào sử dụng nó, tôi mới cảm thấy khá là thích data flow của Redux. Bây giờ thì tôi lại thấy thú vị khi ngồi đọc những comment của những người hay kêu ca về Redux nọ kia (như tôi trước đây? ). Tất nhiên là tôi cũng chưa đến cái tầm để có thể đưa ra một phát ngôn nào đó, nhưng phải nói là tôi thích cái mô hình của Redux với reducer.
Tháng này thì vốn được xác định là để làm open source. Tôi muốn lần contribution đầu tiên này của mình phải là một cái gì đó thật "o-sừm" và phải contribute cho một project nào đó khủng khủng mới được. Tôi sẽ contribute cho React!
Mọi người thì nói rằng nó là một việc rất khó, riêng chỉ đọc hết khối lượng code thôi, chứ chưa tính đến việc contribute được cái gì hay ho. Nhưng, tôi phải khác biệt, tôi phải nổi bật hơn. Có thể contribute của tôi không phải là cái gì đó cách mạng, nhưng nhất định phải có, i want it.
Tôi bắt đầu với docs, sau đó nhảy vào đọc code, rồi đến đọc các issues, các PRs, every single one. Thực sự thì việc ngồi đọc tất cả docs của React một cách nghiêm túc chứ không phải cưỡi ngựa xem hoa như thường là một cách học tập không thể tuyệt vời hơn. Nhưng tôi nhanh chóng nhận ra việc contribute cho React không hề dễ dàng, chả có mấy cái nho nhỏ mà tôi có thể làm được, và nếu có thì người khác cũng sẽ làm nó nhanh chóng.
Ở trong một buổi meetup, tôi gặp Anthony Ng, a ấy khuyên tôi rằng nên thử Downshift - một thư viện autocomplete của Kent C.Dodds. Đây là một bước ngoặt. Downshift dường như phù hợp hơn nhiều với tôi. Độ khó vừa phải, có những issues mà tôi có thể xử lí được, cũng không có quá nhiều contributor, code khá là rõ ràng,.. Hơn cả thì nó - Downshift, chính là câu trả lời cho khá nhiều những vấn đề mà tôi đang gặp phải trong jobSort().
Qua được nửa tháng, tôi có nhận được một cuộc gọi từ một công ty mà tôi apply vào tháng trước. Họ có 2 vòng phỏng vấn qua điện thoại, vòng khởi đầu và sau đó là về technical. Công nghệ mà họ đang muốn dùng là Redux, React và D3 - đúng những cái mà tôi đã học. Tôi chỉ cần đơn giản là ngồi kể lại quá trình làm những project của mình. Sau cuộc đó, họ có ngỏ lời cho một buổi phỏng vấn trực tiếp tại công ty. Buổi phỏng vấn đầu tiên của tôi!
Tôi hầu như không chuẩn bị nhiều cho buổi phỏng vấn, nên tôi đi đến đó với một tinh thần là nhiều khả năng sẽ không được nhận, nhưng đổi lại đó là những kinh nghiệm hữu ích cho những lần phỏng vấn tiếp theo. Hơn nữa hôm đó tôi cũng chỉ ngủ có 3 tiếng vì làm ca đêm đến 5h sáng. Thật may là buổi phỏng vấn đó là 1 tiếng ngồi pair-programming chứ không phải ngồi trả lời câu hỏi hay bài kiểm tra gì cả. Có thể coi đó còn là một bài test khá là thoải mái nhưng tôi thì rất hồi hộp.
Ban đầu thì tôi cố gắng làm sao tỏ ra tôi là người nắm chắc tất cả mọi thứ mà không cần phải search hay tra cứu đâu đó. Nhưng đến khi tôi nhận ra nếu cứ như vậy thì sẽ không thể nào làm xong được, tôi đã mặc kệ không care người kia sẽ nghĩ gì về mình mà bắt đầu google/stackoverflow cho những cái mà tôi chưa rõ. Cuối cùng thì tôi không hoàn thành kịp. Tôi nghĩ là quả này fail chắc rồi.
Phần còn lại của buổi phỏng vấn không còn áp lực nữa vì tôi nghĩ là quả fail chắc rồi. Dẫu sao thì tôi có thể ngẩng cao đầu, vì chí ít là tôi có thể học được nhiều kinh nghiệm cho những lần phỏng vấn tiếp theo. Còn biết đâu may mắn hơn thì tôi lại nhận được offer job đầu tiên
Tháng 9 - Job Offer
Cuối cùng, tôi kết thúc 9 tháng 7 ngày tính từ khi bắt đầu quyết định vùi đầu vào học code để chuyển sang làm công việc của một Software Engineer, bằng 1 offer từ chính công ty đầu tiên mà tôi đi phỏng vấn đó. Tôi thấy khá tự tin, vì nhận được offer ngay lần đầu tiên đi phỏng vấn. Nhưng nếu mà lần này từ chối, thì biết đâu vài tháng nữa mới có một offer tiếp theo? Cuối cùng thì tôi đã chọn accept cái offer này, tôi muốn được nhận lương bằng việc code, tôi thấy vui vì tôi đã quyết định như vậy.
Advice
Từ đầu đến giờ thì tôi đã chia sẻ với các bạn về câu chuyện của mình cũng như một vài lời khuyên. Có thể là có một số các bạn đang đọc bài này thì cũng đang có suy nghĩ về việc chuyển nghề hay đang học code để chuyển nghề sang làm programmer. Thế nên tôi mong rằng các bạn có thể dựa vào một vài lời khuyên dưới đây của tôi để có một kế hoạch, hay làm tốt hơn kế hoạch mà bạn đang thực hiện, để đạt được mục tiêu đề ra của bản thân:
- Nghĩ xem đâu là thứ mà bạn thực sự hứng thú, và hãy sử dụng nó như một lợi thế: Đối với tôi thì đó là checklist, ghi chép lại tiến độ và hoạt động trong cộng đồng (meetup). Nếu như bạn không cảm thấy thực sự hứng thú với mục tiêu bạn đề ra, bạn sẽ chẳng thể hoàn thành nó được.
- Đặt ra các mục tiêu và hoàn thành nó: Tôi nghĩ bạn nên có mục tiêu cho từng tháng, thậm chí là từng ngày. Mục tiêu tháng sẽ giúp bạn theo dõi và giữ bạn đi đúng theo lộ trình để đạt được mục tiêu lớn mà bạn đề ra ban đầu. Còn mục tiêu ngày sẽ là cái để cho thấy rằng bạn vẫn đang tiếp tục mỗi ngày, để chắc chắn bạn đang làm được một cái gì đó thực sự có ích cho việc đạt mục tiêu lớn. Có một cách hay đó là đặt ra các mục tiêu cho hôm sau vào tối hôm trước. Nhờ có vậy bạn sẽ giữ mục tiêu hàng ngày ở mức thực tế nhất, thay vì viết ra mục tiêu cho tất cả các ngày trong tháng tới rồi đến khi làm thì nhận ra là làm thế này chả có ích gì cả. Hơn nữa nó thúc đẩy bạn phải thực sự đạt được gì đó mỗi ngày để hoàn thành mục tiêu đề ra.
- Đi tới những buổi meetup sớm hơn, đừng đợi đến khi sẵn sàng: Nó có thể là một trải nghiệm hơi toát mồ hôi như tôi đã kể bên trên nhưng nói chung là mọi người đều rất tốt và sẵn sàng giúp đỡ bạn. Tất nhiên là ở đâu cũng có những người khó tính, hay phán xét,... nhưng đó chỉ là số ít thôi. Mà hơn nữa thì, mọi người đều thích được đưa ra những lời khuyên, tin tôi đi. (Như tôi bây giờ nè)
- Contribute cho open source sớm hơn, đừng đợi đến khi sẵn sàng: Khi bạn bắt đầu code thì Github là một cái gì đó có vẻ đáng sợ mà bạn không muốn dây vào. Nhưng thực sự thì nó được xây dựng theo một cách khá là welcome. Bạn có thể dễ dàng đọc được những good-code-example và nếu như bạn bắt đầu contribute thì đó còn là một nơi review code giúp bạn nữa. Nếu bạn muốn hiểu thêm tại sao mình nên contribute ngay bây giờ, hãy vào đây.
- Apply job sớm hơn, đừng đợi đến khi sẵn sàng: Cái này thì bạn có thể thấy tôi cũng đã gặp phải. Tôi cứ nghĩ tôi là một người tự học nên cần phải chuẩn bị nhiều hơn. Và tôi cứ nghĩ là tôi sẽ biết được khi nào là thích hợp nhất để bắt đầu. Nhưng thực sự thì, bạn đếch thể nào mà biết được đâu =)) Thế nên hãy bắt đầu ngay bây giờ luôn đi. Tất nhiên là đừng có điên mà apply cho cả trăm công ty nếu bạn còn chưa học xong loop, switch-case,.. là gì. Nhưng cách tốt nhất để biết mình nên học cái gì chính là đi ra ngoài đó và xem xem họ đang cần cái gì.
Vậy đấy, còn giờ thì tắt cái này đi và bắt tay vào code đi chứ còn gì nữa. (tat)
Đọc câu chuyện mà tác giả chia sẻ, sẽ có không ít những ý kiến trái chiều rằng có nhiều yếu tố trong câu chuyện mà người khác khó mà học theo được, như việc tác giả quả thật là một người vô cùng chăm chỉ và đam mê, chưa kể đến việc anh ấy khá là thông minh nữa. Ngoài ra việc sống ở Bay Area cũng không phải là một cơ hội mà ai cũng có được. Chưa kể đến việc tác giả dành hầu như thời gian ngoài công việc của mình cho việc học tập, không bị ảnh hưởng của gia đình, bạn gái/vợ, bệnh tật, công việc bận rộn... Tóm lại nhiều người nói rằng câu chuyện của anh đọc thì có vẻ rất hay nhưng nó chỉ là ngoại lệ thôi vì nó quá khó để đạt được với một người bình thường.
Tuy nhiên với mình thì, giống như lời tác giả đã nói ngay từ đầu, đó là việc mỗi người sẽ có background khác nhau, nhưng điều mà anh ấy mong muốn đó là chúng ta có thể tìm được những gì có ích với bản thân, cứ không phải là copy-paste câu chuyện này vào và chờ đợi một kết quả tương tự đến. Ngay cả đầu đề bài viết cũng là câu chuyện của bản thân chứ không phải là "Làm thế nào để bạn có thể đạt được abc..."
Còn ý kiến bạn thì sao, hãy chia sẻ bên dưới nhé
Cảm ơn các bạn đã dành thời gian đọc đến đây, hơi dài một chút
HAPPY CODING!
All rights reserved