Ngược dòng.
Ngành CNTT Việt Nam hình như đang đi theo một con đường kỳ lạ, rất nóng và ít bền vững.
Từ khi còn giảng dạy, đến giờ, tôi vẫn khuyên các bạn trẻ hơn rằng nên bắt đầu từ nền tảng căn bản: học ngôn ngữ trước khi học framework, học lập trình trước khi học công nghệ. Và tôi tin rằng đây là con đường phù hợp, bền vững; công nghệ thay đổi từng ngày và chúng ta không thể cứ chạy mãi từ nơi này sang nơi khác nếu thiếu nền tảng cơ bản.
Khi tìm đồng nghiệp, tôi cũng tư duy theo cách này. Song càng đi, tôi càng thấy mình ngược dòng với xu thế CNTT Việt Nam hiện nay.
Một câu hỏi được tôi đưa ra cho ứng viên là “Làm thế nào để sắp xếp 1 text file, gồm nhiều dòng, có dung lượng 2GB?”. Tôi nhận được câu từ chối trả lời nhã nhặn rằng: “Tôi không giỏi về thuật toán, và công ty cũng đang tìm iOS developer? Vậy hãy hỏi tôi những kiến thức về iOS.”.
Tôi đồng tình và đưa ra câu hỏi mới về iOS: “Bạn nhận được 1 text file từ vụ VN Airlines leak, gồm nhiều dòng, có dung lượng 2GB, và cần hiển thị thông tin đó trên 1 iOS app dưới dạng danh sách được sắp xếp theo alphabet để tiện tra cứu. Bạn sẽ làm thế nào?”
Ngành CNTT Việt Nam hình như đang đi theo một con đường kỳ lạ, rất nóng và ít bền vững
đọc bài mới thấy thấm thía lời của đồng nghiệp(nay đã nghỉ việc chỗ em). Muốn lập trình khá thì chú cứ học CTDL & GT cho anh
Hoàn toàn đồng ý Có thời gian rỗi thì nên làm vài bài trên HackerRank hoặc các trang tương tự như leetcode hoặc geeksforgeeks để khỏi quên.
Quảng cáo:
Đạt cũng đang ôn lại CTDL & GT để dạy khóa học sắp tới.
Đó là hệ qủa của việt công nghệ phần mềm dựa trên framework. Khi mà không cần biết các cấu trúc cơ bản linklist hay các thuật toán xắp xếp mã hóa nén v.v.v… khi mà các nền tảng đã có đủ các thứ đó.
Và vói nó đủ để làm ra một sảm phẩm chạy được.
Quay lại bài toán 2G text. Anh chàng lập trình viên IOS đó đúng. với 2G không ai xử lý trên dtđ mà có 1 server riêng và anh ta chỉ làm nhiệm vụ là code giao diện code phần đọc ghi socket v.v.v… Anh ta làm tốt những cái đó vậy là đủ.
Còn việc nó chạy như nào thì anh ta không cần biết. Nó cũng phần nào phản anh thực tế 1 server phục vụ hàng nghì khách hàng.
Thầy của em ( trường BKHN ) cũng nói " đến khi tôi thi lên tiến sĩ tôi vẫn toàn dùng nháp với bút chì. Toàn học thuật toán mà giờ vẫn đứng đây chém gió về công nghệ ầm ầm :)"
Cảm thấy yên lòng, toàn tập trung vào thuật toán, trong khi bạn bè thì gặp toàn nói về công.nghệ này nọ, có thời gian bí bách ko biết tập trung đúng hướng ko. Hôm nay bài này đang được share mạnh.
Nếu là python tôi sẽ duyệt từng dòng đối tượng File text. Sau đó append nó vào môt list mới. Dùng phương thức sort() để sắp xếp danh sách theo alphabet. Và dùng thuật toán tìm kiếm nhị phân để tìm kiếm đối tượng mong muốn.
Trái tim của lập trình là thuật toán - cách bạn giải quyết vấn đề. Và trái tim của mọi kiến thức - đó là kiến thức cơ bản. Mình luôn coi trọng 2 cái đó nhất trong quá trình tự học lập trình. Bạn chạy theo công nghệ thì bạn là một kẻ ngu ngốc vì công nghệ là thứ ra đời hàng ngày, một công nghệ có thể nhanh chóng trở lên lỗi thời. Nó chỉ là thứ công cụ giúp ích cho bạn trong từng giai đoạn. Còn cơ bản nó là nền tảng quan trọng nhất, nếu bạn nắm vững cơ bản thì bạn có thể học bất kì một công nghệ nào một cách nhanh nhất. Còn lập trình mà không biết chút gì về thuật toán thì bạn chỉ là một tay codder xoàng xĩnh đôi chút ý kiến bản thân
rất chờ đợi và cũng đã hóng nó từ rất lâu rồi a ạ
iOS mình chạy giaỉ nén tầm 300MB lag lòi tôm luôn, lấy đâu ra mà xử lý 2GB. Ông tuyển dụng cũng hơi chém qúa hoặc chưa bao giờ làm app mobile.
Nếu tôi nói tôi phải xử lý ETL 1TB dữ liệu chỉ với 1 con job 4GB HeapMem thì bạn có tin không ?
Việc xử lý theo chunk thì cũng không phải là cái gì qúa ghê ghớm. Trước mình xử lý các file text với 1 vài TB dữ liệu, mỗi lần chỉ đọc khoảng vài trăm MB rồi save vào db thì không nói làm gì? (hoặc xử lý các file excel với vài trăm nghìn row, mỗi row khoảng 1 ngàn cột) Tuy nhiên, ở đây, bạn ngoài việc đọc / bóc tách ra, bạn còn phải sắp xếp theo alphabet nữa thì nó lại là chuyện khác nhé.
bài toán đã được giải rồi nhé
+
OK, giaỉ pháp mà bạn đưa ra có vẻ giaỉ quyết được vấn đề … nhưng chỉ ở học thuật mà thôi. Chứ bạn đã thử làm với app mobile chưa, tốc độ reponsive thế nào? Mình đồ rằng với con iPhone6s Plus 1GB RAM (riêng RAM dành cho OS đã tầm 700 MB rồi, cộng với con CPU 1.4GHz Dual-core), riêng việc đọc, merge, external sort, … thì có đến mùa quit nó mới sắp xếp xong.
Làm app thương mại, ngoài vấn đề giaỉ pháp ra còn 1 vấn đề nữa về trải nghiệm người dùng nữa nhé. Thế nên giaỉ pháp nó cũng phải hợp lý, chứ không phải cứ lý thuyết làm được rồi lao đầu vào làm.
Em nghĩ câu hỏi phỏng vấn không cần phải có một giải pháp hoàn hảo, cái quan trọng là interviewee show được kiến thức của họ. Cách giải quyết vấn đề thông qua cách họ phân tích câu hỏi, đưa ra giải pháp. Chứ không phải là “sorry, please ask other questions”
Ví dụ như Google hỏi cách reverse một binary tree. Hay viết lại hàm permutation. Hay thử implement smart pointer, share pointer trong C++. Hay implement lại hàm malloc,etc.
Các câu hỏi này chỉ mang tính kiểm tra kiến thức của lập trình viên thôi anh.
Cho em hỏi mấy xử lý nặng kiểu này thì nên cho server xử lý rồi app kéo từ api về thôi đúng không?
Về thực tế thì đúng là thế, nhưng bài toán đặt ra là bạn giải quyết thế nào với một lượng resource hạn chế hay sâu hơn là sự kiên nhẫn của bạn như thế nào. Nếu đặt bài toán với 2GB trên con iPhone thì nó cũng tương tự như với 2TB hay 2PB trên con server vậy thôi.
Thuật toán có thể hôm nay chậm, nhưng ngày mai có thể hiệu chỉnh được, chỉ là đừng hài lòng với chút kiến thức cỏn con, rồi tự bơi trong cái ao của mình.
Cho em đào mộ.
Lúc câu hỏi này được đăng trên anh Hiền, các bài báo cũng copy của ảnh. Em thấy đa số mọi người không quan tâm cách giải như thế nào, mà chỉ bàn các vấn đề xung quanh: bài toán không thực tế tôi không giải, không cần học giải thuật, rồi bản qua bàn lại đến chuyện vĩ mô lập trình viên Việt Nam có cần học thuật toán, Việt Nam không giỏi về IT,…
Nhưng với thầy cô Đại học, bạn bè học Master, PhD ở nước ngoài lại rất hứng thú với việc giải bài toán, có người giải merge sort, người khác đưa ý kiến thêm radix sort, giải pháp lạ lùng là sleep sort (lần đầu mình biết), rồi dần chuyển sang các giải thuật song song, chunk, MapReduce. Họ quan tâm đến kĩ thuật nhiều hơn là quan tâm các vấn đề vĩ mô, nhân lực.
Trong các cuộc thảo luận về kĩ thuật, có 1 anh đã phỏng vấn tại Google, câu hỏi họ đưa ra gần giống anh Hiền nhưng khó khăn hơn: “Sắp xếp text file có dung lượng 1GB từ đĩa cứng trên máy có RAM < 1GB, yêu cầu chỉ được đọc ghi 1 lần”. Ai cũng bí không giải được câu hỏi Google.
Thực ra cái câu hỏi “algo” đó làm cho bài viết bị loãng đi và đẩy nó sang một chiều hướng khác. Mà ngôn ngữ mạnh là nhờ framework, bỏ framework thì làm gì.
Bác nói đúng, ngôn ngữ mạnh là nhờ framwork. Nếu ko có nó thì mọi người code ai người đó viết, code ai người đó đọc…Còn nếu ko có framwork thì vào các cty họ cũng tự buil framwork của họ dựa trên ngôn ngữ lập trình. Nói chung muốn tiến xa thì giỏi lập trình, muốn kiếm cơm nhanh thì học framwork