Lâu lâu tớ lại quyết định không làm việc khuya, phần vì tớ thấy dần mình nên bỏ đi thói quen cày cuốc, phần vì tớ nhận ra cày cuốc không làm tớ "tốt"(giỏi??) lên...
⚠️ Note: Bài viết có tính chủ quan và do một trẻ trâu chưa trải sự đời trong làng dev viết... Các bô lão xin đừng chửi.

Câu chuyện bắt đầu từ những ngày mới chập chững học code, khi mà sự nghiệp gõ phím mới bắt đầu, tớ là một thành phần điển hình trong làng code: Ngủ ngày, cày đêm, cào phím và lâu lâu sợ nước :v …
Ngày đấy, tớ có thể ngồi 2 - 3 ngày liên tục để tìm 1 phương án nhằm giải quyết vấn đề khi làm việc. Vấn đề tớ gặp phải thì cũng rất đa dạng, thường sẽ là những vấn đề sau:
- Không hiểu rõ mình đang làm gì. Điển hình là phát triển một số tính năng mà không định hình được thực sự mình sẽ phát triển cái tính năng đó như thế nào cũng như đích đến (hay kết quả) của tính năng / sản phẩm trông sẽ ra sao.
- Thiếu kiến thức nền tảng, không biết sử dụng các thành phần cơ bản khi phát triển.
- Phát triển một cách thiếu tính toán, đôi khi là phi logic. Nhiều khi các newbie / fresher, junior, thậm chí là cả senior sẽ tính toán lẫn lộn một chút trong quá trình phát triển và đi lệch lạc, lòng vòng, rất mất thời gian.

Những vấn đề trên, theo mình là rất điển hình. Có thể nói, hầu như cái ngành CNTT này ép developer phải tự học là chính. Nhưng như mình đã nói, tự học thì lại hay dính phải những vấn đề trên…
Kể cả hiện tại, mọi thứ với mình vẫn là một cái thứ gì đấy rất rối rắm khi phát triển và hoàn thiện các dự án cỡ vừa và lớn. Về bản chất, lí do chính là tớ đang làm Full-stack web và đôi khi là làm Mobile Apps. Có thể các bạn biết đến tớ với những cái app mobile tớ làm nhưng kỳ thực mọi thứ đều bắt đầu từ web.

Để giải thích sơ cho bạn nào không biết, Full-stack nó có thể hiểu luôn theo ngữ nghĩa trên mặt chữ: Full - stack.
Nếu bạn hiểu 1 project như 1 chồng các lớp khác nhau (layers) của các thành phần thì stack chính là 1 số lớp bên trong đó.
Mình sẽ thử chia “sơ lược” một cái project web ra cho dễ hiểu:
Để phát triển 1 web, bạn cần phát triển 2 thứ ở 2 phía, đó chính là ở server-side(hay thường gọi là Backend) và ở client-side(gọi là Fronted). Về bản chất, một web developer sẽ cần phải biết cả hai mảng này để có thể phát triển web được (tại sao? mình sẽ giải thích sau). Vậy thì 2 layers của project đây chính là Frontend và Backend. Và thường, ở công ty lớn người ta sẽ chia việc cho từng người một, làm từng mảng một: Team Frontend và Team Backend.
Hai đội này sẽ cùng nhau phát triển cũng như bổ trợ cho nhau, nhưng chuyên biệt thì Team Frontend tập trung làm giao diện còn Team Backend phát triển hệ thống.
Quay lại câu chuyện trước, tại sao 1 web developer lại cần kỹ năng của cả 2 layers trên? Bởi vì muốn dùng búa phải biết cái búa là loại búa nào!

Công nghệ thời nay nó là một chuỗi các tầng lớp, các kỹ thuật và các công cụ liên đới tới nhau. Chúng “lồng ghép” vào nhau theo đúng nghĩa đen và phát triển theo mạng lưới. Bạn muốn code web, bạn sẽ cần học HTML, nhưng web đẹp thì lại cần CSS. Muốn xử lí các event client-side thì sẽ cần học JavaScript và muốn tương tác với Server thì sẽ cần biết viết các ngôn ngữ Backend như PHP, Go, Java (Spring), …
Câu chuyện ở đây không phải là 1 Backend Developer cần phải biết code Frontend để mà bắt tay vào code, thực ra chúng ta nên thấu hiểu nhau để làm việc tốt hơn. Tỉ dụ, nếu bạn không hiểu team Frontend đang làm cái quái gì với đống data bạn output ra, đôi khi team Frontend sẽ hiểu sai ý bạn. Ngược lại, nếu bạn hiểu được team Frontend sẽ hiển thị dữ liệu ra như nào, trình bày bố cục ra sao, API của bạn sẽ phát triển phù hợp hơn, tiện lợi hơn cho quá trình phát triển giao diện.
Điều này sẽ giúp ích rất nhiều cho team Frontend.

Lại nói về vấn đề, chuyện phát triển, điều gì là khó?
Thời gian đầu không ai hướng cho mình theo hướng nào, thế là mình vô tình trở thành 1 Full-stack developer. Lưu ý giúp mình rằng không phải bạn biết code Backend và code Frontend thì bạn sẽ trở thành Full-stack developer. Thực chất, cái tính full-stack ở đây nó nằm nhiều về tư duy, kiến thức và mức độ thông tuệ về các mô hình thì đúng hơn.
Như mình đã nói, bạn sẽ phải học “rất rất rất” nhiều thứ để thực sự full-stack. Tuy mình vẫn ghi vào CV là Full-stack, song mình vẫn chưa thực sự tự tin với kỹ năng và kiến thức của mình vì nó vẫn đâu đấy loanh quanh tầm tầm Junior là cùng…
Bạn thấy đấy, để “tiến bộ” trong cái ngành này, thực sự cái việc bạn gõ nhanh như gió bằng 10 ngón hay sử dụng thành thạo các IDE không giải quyết nhiều vấn đề. Song, với các Newbie / Fresher thì việc gõ được 10 ngón, phát triển dự án thật nhanh chính là điều duy nhất họ quan tâm…
Và, sự thật thì không phải thế.

Hầu hết các ý tưởng nảy ra trong đầu những người mới học đều “đầy tính ngẫu hứng”, vậy nên, nó sẽ hơi thiếu chiều sâu. Đây là một điều có thể minh chứng rất rõ nếu bạn có đọc qua một chút về tâm lí học hay thậm chí không cần tâm lí học: “Cả thèm chóng chán”.
Vấn đề này quá là rõ ràng, khi bạn có hứng, bạn sẽ làm cật lực. Khi hết hứng, bạn vứt nó đi.

Quá trình phát triển “có sự học tập” là một quá trình yêu cầu sự tìm hiểu về chiều sâu nhiều hơn chiều rộng. Tất nhiên, bạn vẫn có thể học được những kiến thức mới… Song, sự thật mà mình nêu trên là bạn không thể tiến xa nếu cứ tiến theo chiều rộng (điều mà mình đã - đang theo, và sẽ sớm ngừng lại). Sẽ rất tốt nếu bạn có hết tất cả hiểu biết về Security, System, Networking, Data Analysis, Hacking, … Nhưng, chỉ biết thôi là đủ, hãy đi sâu vào chuyên môn của mình.

Gần đây, mình đang phát triển một dự án ở công ty, quy mô ban đầu theo mô tả của khách hàng thì khá là đơn giản. Nó là một hệ thống quản lí các cấp ở công ty cũng như quản lí các nhà đầu tư. Ban đầu mình code rất cháy, 1 buổi thôi đã hoàn thành quá nửa các requirements ban đầu mà khách hàng đề ra…
Và rồi, chuyện gì đến cũng đến!!! Xoạch, mình nhận ra sếp đưa thiếu requirements so với những gì khách yêu cầu. Đây về cơ bản không phải là lỗi của mình, nhưng cũng không thể nói là lỗi của ai cả. Khách thì rõ là họ không hiểu họ muốn gì cho đến khi thấy thành phẩm và bắt đầu chửi (-.-), còn sếp mình thì cũng mới nhận dự án này, không có time chuẩn bị… Một lí do nữa là project này lại trớ trêu thay không có BA nên mình phải tự luận, tự xây dựng database, tự phát triển và tự giải quyết các vấn đề Security. Không những thế -.- ban đầu mình được yêu cầu chỉ cần phát triển Frontend Client cho Project này… Vậy thì tính ra, mình đang phát triển 1 dự án của Công ty với danh nghĩa “Full-stack Web Developer”, mặc dù mình là Mobile Developer (“)>.

Trong khi sốc nhiệt chưa hết, mình nhận ra tiếp rằng cơ chế mình đang phát triển gần như “unable to re-scale”, tức là đếch có cái cách nào mà phát triển thêm khi dự án lớn ra cả. Vậy nên, tớ quyết định cắm mông và code tiếp…

Lần này, tớ ném hết tất cả tầng lớp trong công ty vào và gọi chúng là các “Objects”, sau đó set quyền sở hữu của từng Object cho từng tài khoản trong hệ thống thông qua 1 cái bảng khác có thể nói sơ là 1 cái bảng ghi quan hệ. Tuy nhiên, lần tiếp trong khi tớ đi tắm, tớ đã nhận ra những vấn đề rất lớn về Performance mà dự án có thể mắc phải.
Với MySQL và PHP (PHP vì không có lựa chọn khác do vấn đề thời gian và hiểu biết có hạn 😑), 10.000 users với 3 cái bảng hết Join, references, blah blah các kiểu, chắc server response phải trên 5 giây quá @@ …

Một lần nữa, tớ lại phải tính toán lại mọi thứ, thực hiện rất nhiều kỹ năng, lại phải cân nhắc thêm nữa về vấn đề Security… Và mãi tới giờ mới tính được khỏi cơn lú 🙁 

Kỳ thực, bạn code được gì nó không quan trọng… Để làm dev, theo nghiệp dev và phát triển được trong nghiệp dev, tư duy, tính toán và cân nhắc kỹ trước khi code mới là quan trọng.

Code chia làm ba giai đoạn, trước khi đặt tay lên code, đang code và sau khi code… Hãy quan tâm vào phần đầu và phần cuối, phần giữa không phải là phần khó đâu!!!! Người ta có câu, trí não đỡ chân tay mà :v

Cheers!!!! See u later in next post!
//Nguyen Anh Nhan

Post a Comment

Cảm ơn bạn đã quan tâm và bày tỏ :D

Mới hơn Cũ hơn