Tuesday, February 27, 2018

Phỏng vấn đại ca Tiger Nguyễn về ngành BrSE

Có thể bạn chưa biết, trong ngành phần mềm, có một chức danh (đúng hơn là cả một ngành) mang tên Bridge SE – Kĩ sư cầu nối.
Tuy không phải là ngành quá hot hay nổi tiếng, nhưng ngành này lại có khá nhiều cái thú:
  • Được vi vu qua Nhật Bản ngắm hoa anh đào, ngắm các em nữ sinh Nhật chân dài váy ngắn.
  • Được làm việc với các tập đoàn, công ty IT lớn hàng đầu Nhật Bản để mở mang tầm mắt.
  • Mức lương không quá khủng, nhưng đủ sống ở Nhật và là con số mơ ước của nhiều người Việt Nam.
Vì nhiều bạn đọc cũng muốn tìm hiểu thêm về ngành này, hôm nay mình có một cuộc phỏng vấn nho nhỏ với anh Tiger Nguyễn, chủ blog Kí sự BrSE. Là một BrSE “cứng cựa” với hơn 5 năm kinh nghiệm, anh Trọng sẽ chia sẻ về triển vọng của ngành, tố chất cần có, con đường trở thành BrSE với các bạn nhé.


  1. Anh có thể giới thiệu sơ về bản thân cho bạn đọc biết được không?
Anh tên Trọng họ Nguyễn tự là Tiger. Tuổi 30 nghề code thuê vs cài win dạo, ước mơ là thay đổi thế giới. Giỡn chứ anh đang làm BrSE cho Hitachi Consulting. Kinh nghiệm nghề mần phần mềm 7 năm có lẻ.
Hiện anh đang ở Yokohama, một thành phố cảng gần Tokyo cùng với vợ và cậu nhóc 2 tuổi (nhiều người bảo may nó giống mẹ nên ưa nhìn), sở thích thì nhiều lắm như xem bóng, đá banh, chơi ghita, bày trò với nhóc con, và xem phim (phim gì anh không nói đâu nên đừng cố hỏi).
  1. Được biết anh theo nghiệp BrSE cũng lâu, anh có thể chia sẻ sơ về ngành BrSE ở Việt Nam và công việc hàng ngày của mình không ạ?
Thực ra cũng không lâu lắm, mới hơn 5 năm thôi. Chia sẻ về nghành BrSE thì nó hơi rộng, anh như ếch ngồi đáy giếng nên có nói cũng không bao quát hết được. Nhưng trong phạm vi kinh nghiệm cũng như tầm hiểu biết của mình thì a dám chắc một điều là nghành này sẽ hót ít nhất trong tầm 10 năm nữa.
Ở đây anh nói BrSE cho Nhật thôi nhé, lý do đơn giản là dân số Nhật già quá nên lao động sụt giảm mạnh, họ cực kỳ khát nhân lực để làm SE cho công ty trong nước, cũng như BrSE cho những dự án khoán ngoài. Và điểm đến ưu tiên mở rộng nhất của họ là Việt Nam để giải được bài toán Trung Quốc + 1 (cái này anh sẽ chia sẻ sau). Nhưng tóm lại là theo nghề này không lo đói :D.
Còn ý cuối về công việc thường ngày thì a cũng có chia sẻ trong bài viết Công việc thường ngày của BrSE, hầu hết những việc trong đó anh đều trải qua cả nên đúc kết lại.

  1. Lý do nào khiến anh lập nên blog “Kí sự BrSE” vậy ạ?
Lý do là vì chú xúi anh viết. Năm ngoái a có một tháng nghỉ việc ngồi chơi xơi nước, rảnh quá không biết làm gì nên tìm truyện cười để đọc, tình cờ tìm thấy blog toidicodedao đọc vui quá trời quá đất, như haivl (nhắc thấy nhớ) và cũng học hỏi được nhiều điều.
Nhưng đến cái bài j mà chú bảo làm IT phải viết blog – chứ không chia sẻ là nhục nhã – ích kỷ (ý đại khái là vậy) nên nhột nhột. Cái nữa là tìm nát cả Google không có một blog nào viết về nghề này cả, toàn quảng cáo lương ngàn đô trong khi chả ai vẽ đường cho hươu chạy nên bực quá mới viết đôi chữ, chứ thực ra chuyện viết lách là quá tầm với anh.
Lời người phỏng vấn: Nói thế chứ anh Trọng đã đều đặn viết blog kí Sự BrSE được gần 1 năm rồi đấy các bạn ạ.
  1. Cơ duyên nào đưa đẩy anh tới ngành BrSE nhỉ? Thời sinh viên anh có từng mường tượng một ngày nào đó mình sẽ trở thành BrSE không?
Trong bài Mình đã học tiếng nhật như thế nào anh có chia sẻ, nhưng nhiều bạn ngại đọc dài nên tiện đây a tóm váy lại luôn.
Sự thể là hồi cuối năm 3 anh được một công ty Nhật tuyển, học JP hơn năm thì kế hoạch bể do khủng hoảng (thị trường chứ không phải anh). Ra trường đi làm được 2 năm thì công ty cũ của anh (Fsoft) có mở lớp BrSE học từ N4 lên N2 trong 5 tháng.
Sẵn có chút vốn liếng JP rồi nên đời đưa thì anh đẩy thôi chứ mường tượng sẽ theo nghiệp này từ hồi sinh viên thì cũng không hẳn (cười) cái này là cơ duyên.
  1. Nhiều bạn SV muốn theo ngành BrSE vì thích qua Nhật xem JAV, nhầm, tìm hiểu văn hoá Nhật Bản. Anh có thể chia sẻ về tố chất mà sinh viên phải có để làm BrSE, cùng với những cái sướng của ngành BrSE được không?
JAV? Cái này anh cũng thích, hồi chưa lấy vợ anh hay xem lắm, giờ có gia đình rồi cũng 2 vợ chồng cũng hay xem chung tối tối – vợ a cũng thích, ý anh là Japan Anime Video như OnePiece hay Naruto …
Tố chất để trở thành BrSE, thực ra chả cần tố chất gì đâu, ai chả làm được, nghề này dễ òm. Chỉ cần chăm xem JAV (hoạt hình ấy), chăm học từ vựng rồi lấy cái N2, tự làm đồ án cho quen sau này mềm tay dễ code.
Tranh thủ mấy năm sinh ziên kiếm việc mần cho năng nổ, có việc liên quan lập trình càng tốt, không thì phục vụ quán cà phê cũng chẳng sao. Trong quá trình này sẽ học được nhiều điều, vì lập trình viên không phải chỉ biết code (cái này e hay nói mà), như ngày xưa sinh ziên anh cũng vừa học JP vừa đi phục vụ nhà hàng, dạy thêm (học trò toàn gái xinh).
Cái sướng trong nghề cũng nhiều, đối với những bạn thích bay nhảy đi đây đi đó thì không gì tuyệt hơn. Các bạn sẽ được làm với các cao thủ IT khủng của các tập đoàn lớn, mở mang tầm mắt. Được ngắm hoa anh đào mỗi khi xuân sang, lá vàng khoe sắc độ thu về, tuyết rơi bộp bộp khi đông đến, nghĩ thôi cũng thích rồi.
Ngoài ra còn 1 cái sướng mà anh biết các bạn đồng quan điểm, đó là thu nhập: làm BrSE không lo đói, chỉ không giàu thôi
Tuyết rơi lạnh teo trym
  1. Bên cạnh những cái sướng đó chắc cũng có nhiều cái cực khổ anh nhỉ? Anh chia sẻ luôn để các bạn sinh viên đỡ vỡ mộng nhé (cười)!
Tất nhiên rồi, khổ nhất là đi ngoài đường hay gặp “thần tượng” chỉ thấy các em lướt qua như làn gió mà không làm ăn được gì :D, cách đây 5 năm anh có gặp em Maria xxx… (tự hiểu) ở công viên Yoyogi – hồi đấy em hãy còn xuân.
Giỡn chút cho mấy bạn chuẩn bị tâm lý với mấy gạch đầu dòng bên dưới:
  • Áp lực: Làm BrSE phải chịu sức ép cả hai phía đội khách – đội nhà, phải cứng mới trụ nổi chứ không bẹp dí. Ví dụ đội nhà đang OT triền miên mà chưa xong, trong khi khách muốn keep deadline, có khi còn muốn đẩy nhanh sớm. Giải bài toán này được thì làm BrSE được.
  • Xa nhà: Sống xa gia đình không phải ai cũng chịu được lâu dài. Lâu bao nhiêu thì tùy dự án, cái này tùy khách quyết chứ mình không chơi kiểu “em nhớ mẹ quá sếp ơi, em ứ làm nữa đâu, cho em về”.
  • Đường thăng tiến không rõ ràng: Có anh gặp hên trúng khách bự có thể được lên cấp vèo vèo nhưng đa số còn lại phải nhảy dự án này sang dự án khác như lính chiến vậy.
  • Về mặt chuyên môn: BrSE luôn phải gồng mình ra học và áp dụng nhanh ngôn ngữ/framework. Anh chuyên Java nhưng có dự án C# đang cần người thì vẫn phải ngồi cày lấy kinh nghiệm mà tiếp nhận dự án, xong cái C# anh lại nhảy qua Cobol, rồi C … vậy nên cái gì cũng biết nhưng không giỏi cái gì (đang nói đa số, tất nhiên có vài anh ngoại lệ cái gì cũng giỏi).
  • Về lương bổng: các bạn hay thấy tin tuyển BrSE lương 2000$. Trong nước thì đây là con số đáng mơ ước, nhưng nếu sống ở Nhật với mức lương này thì cũng chỉ mức trung bình thôi. Thu nhập bình quân Nhật là 3000$/tháng, chuẩn nghèo là 1500$, nên mức 2k thì chỉ hơn chuẩn nghèo có chút xíu, ăn tiêu tiết kiệm thì may ra dư được 1 nửa.
  • Còn 1 số cái nữa nhưng tạm thời anh chưa dám nói, sợ các bạn sock.
  1. Thuở xưa em cũng từng học tiếng Nhật để xem JAV, lộn, để nghiên cứu tư liệu. Em thấy tiếng Nhật học khó và mệt hơn tiếng Anh nhiều. Anh Trọng có thể chia sẻ một số kinh nghiệm bản trong việc học tiếng Nhật của mình cho các bạn không?
Cái chuyện học JP của anh nó cũng lận đận lắm. Nhưng mà anh thấy nó dễ hơn tiếng Anh, tiếng Anh học cả chục năm mà chả giao tiếp được bao nhiêu – chỉ đọc vs viết, nhưng JP anh học xong BrSE là có thể nghe nói đọc viết tạm tạm rồi. Có thể do cấu tạo vòm họng cùng là người châu Á da vàng nên phát âm cũng dễ hơn so với tiếng của người da trắng.
Kinh nghiệm thì các bạn có thể tìm thấy vô số trên các diễn đàn chuyên tiếng Nhật nên anh nói đây hơi thừa. Quan trọng các bạn nên nhớ 1 điều là ban đầu học chậm, nắm chắc, ngấm lâu, sau này từ N3 trở đi sẽ tiến rất nhanh.
  1. Lúc mới qua Nhật, xứ lạ quê người anh có cảm thấy buồn hay nhớ nhà gì không. Anh chia sẻ 1 kỉ niệm vui và 1 kỉ niệm buồn buồn lúc vừa qua Nhật nhé
Anh có chia sẻ trong bài Lần đầu đến Nhật một vài chuyện.
Có một chuyện anh chưa kể là hồi mới cưới xong đúng một tuần anh phải khăn gói đi onsite, và một lần nữa lúc vợ sinh anh không về kịp. Đó là hai lần anh vẫn thấy có lỗi nhất, và nếu làm BrSE thì đành phải chấp nhận. Chuyện vui thì kể cả ngày không hết, nên thôi, các bạn tự trải nghiệm vậy.

  1. (Câu hỏi từ bạn đọc) Cộng đồng người Việt làm BrSE ở bên Nhật có nhiều không ạ? Qua bên Nhật cuộc sống thế nào ạ, vui vẻ hay buồn chán anh? Có nhiều chỗ ăn nhậu vui chơi giải trí không anh?
Cộng đồng Người Việt thì đông (tầm 15 vạn người) nhưng làm BrSE thì không nhiều, chủ yếu là người tị nạn hồi những năm sau 75, học sinh, tu nghiệp sinh, cũng có cả những kỹ sư cớ khí – điện – xây dựng làm cho các tập đoàn, anh cũng hay đi đá bóng với mấy anh em.
Cuộc sống bên này hơi yên ả, không nhộn nhịp như ở nhà nhưng đổi lại là không khí trong lành, đồ ăn sạch, hàng điện tử bát ngát, quán nhậu cũng tấp nập và bia cũng ngon  Ngoài ra nếu bạn nào có con nhỏ mà ở bên này thì điều kiện y tế giáo dục rất tốt, công viên dành cho trẻ con chơi thì đâu đâu cũng có, rất nể các bác Nhật làm quy hoạch – quá bài bản.
  1. Nếu một bạn sinh viên năm 4/mới ra trường, hoặc ra đi code được 1-2 năm, muốn đi theo hướng BrSE thì nên đi như thế nào?
Trong bài Hai năm từ dev lên BrSE, anh có nói cụ thể số giờ cần thiết từ Dev lên BrSE. Quan trọng nhất là 3 thứ: JP + Code cứng + Kỹ năng mềm.
  1. Câu hỏi cuối cho anh nhé! Anh có lời khuyên gì dành cho các bạn sinh viên ngành IT, nhất là những bạn muốn theo ngành BrSE không?
Đầu tiên mình mừng cho các bạn vì ngành IT ra trường xin việc không khó khăn như các ngành khác. Việc đạt đến tầm lương nghìn đô cũng không phải là hiếm, vấn đề các bạn chuẩn bị ra sao để đáp ứng nhu cầu của nhà tuyển dụng.
Cái thứ 2 là ngoài BrSE ra có rất nhiều lựa chọn, có thể học tiếng anh cho tốt rồi làm các doanh nghiệp nước ngoài, hoặc ngay cả BrSE cũng ko chỉ có Nhật mà Âu Mỹ cũng có nhu cầu, tất nhiên là số lượng ít hơn Nhật và cạnh tranh cũng cao.
Cuối cùng mình muốn nhắn nhủ các bạn là cái gì cũng phải có sự đánh đổi, muốn có ngoại ngữ thì bớt chơi bớt nhậu, muốn làm việc với Nhật thì phải xa gia đình, muốn code cứng thì phải bỏ thời gian đầu tư học hành làm việc đường hoàng.
Các bạn có thể chọn cuộc sống nhàn nhã ăn chơi vui vẻ, nhưng nếu có một người trong số đám bạn bứt phá lên được bằng nỗ lực thì cũng đừng ghét họ, hãy cố mà chạy theo nếu muốn. Không có con đường nào bằng phẳng, nhưng nó không gồ ghề như các bạn tưởng tượng đâu, cứ đi thì ắt đến thôi.
Chi tiết hơn thì a có viết đôi lời trong bài Gửi các bạn sinh viên IT.
Đôi lời tâm sự ngoài lề
Điều cuối anh muốn tâm sự một chút ngoài lề – cái này em có thể không đưa vào bài viết cũng được vì nó hơi tiêu cực. Hiện tại thực trạng người Việt phạm pháp ở Nhật là đáng báo động.
Các bạn hay chửi tụi Trung quần què nhưng nghĩ lại coi, người Tàu họ đông gấp 5 lần (75 vạn so với 15 vạn) nhưng tỉ lệ phạm tội thấp hơn hẳn, các vụ bị cảnh sát phát hiện thì người Việt chiếm gần 1/2 so với tổng tội phạm người nước ngoài, còn rất nhiều vụ không bị bắt anh từng chứng kiến hoặc nghe kể lại từ chính người trong cuộc.
Vẫn thông cảm với các bạn là hoàn cảnh khó khăn nên đã sa chân làm cái này cái kia (anh không muốn nói cụ thể) nhưng làm gì cũng nghĩ đến hậu quả, không chỉ hại thân mà còn làm mất đi cơ hội của các em út sau này muốn sang du học hoặc làm việc.
Các bạn sắp qua xin nhớ cho mấy việc: không đá tàu, không “cầm nhầm” đồ người khác, và không nhìn lén váy nữ sinh trung học (tội này khá nặng, phạt 30 man và trục xuất vì nó thuộc hành vi quấy rối tình dục).

Monday, February 26, 2018

Coding Horror: So You Don't Want to be a Programmer After All

I get a surprising number of emails from career programmers who have spent some time in the profession and eventually decided it just isn't for them. Most recently this:
I finished a computer science degree last year, worked about a year in the Java EE stack. I liked requirements engineering and more 'management stuff' in university, but let's face it: you tend to be driven to be a programmer. I enjoy programming itself. I'm not doing it that badly, I even do it better than some people. But it's too frustrating. Stupidly complex stuff (that people consider "standard" even if it's extremely complicated!), fighting against the computer, dumb errors, configuration, and stuff that people even worse than me implemented and I have to take care of. New stuff which is supposed to be incredibly easy, and it's just one more framework.
I think I realized I don't want to program because I landed at a company where people are quite good. And I honestly think I won't achieve that level, ever. And I don't enjoy programming as a hobby.
I'm sure that I'm good enough to be able to make a living continuing as I am … but I don't want to.
And this:
Since the first year of studying programming at university I have known in my heart that computer programming is not meant for me, but I was afraid to do anything about it and here I am now 12 years later programming with no passion. I am a career programmer and an average one at best.
I come to work every day with no passion I just do it to pay the bills. I have done some good projects but I am not at all into it.
It was always our hope that concrete, substantive programming career questions could be asked on Stack Overflow, and some early ad-hoc polling indicated that career questions might be accepted by the community, but if you look at later poll results, it's clear that the career questions came out juuuust under the cutoff point as determined by the Stack Overflow community.
Well, what about the rest of the Stack Exchange network? How about our sister site at programmers.stackexchange which is less about programming problems with source code and more about whiteboard style conceptual programming questions? Apparently, career questions are not welcome there either. But wait! Surely programmer career questions are a fit on a site that's explicitly about career related topics? The very same question was asked on workplace.stackexchange:
I'm graduating soon with a Bachelor's in Software Engineering, however during the course of getting my degree I decided I do not want to be a programmer.
I minored in Business Management and really enjoyed that, particularly the management side of psychology and the basics of the processes involved with restructuring a business, but don't really want to throw away my programming degree either.
Is there a field for someone with a Software Engineering degree who wants to get into business management instead of programming? I'd like to combine my knowledge of making software with some kind of business process oriented work. How should I go about changing to this field? Is this possible without going back to school?
Nope. Sorry. That was closed, too, either because it was seen as a 'recommend me a job' or because it's too specific to programming. Pick your interpretation. I am sympathetic to this quandary because career questions, by their very nature, tend to be so narrow and opinionated that they are frequently only useful to the person who asked – which is completely counter to the goal of Stack Exchange. You know, endless permutations of things like "My boss Jeff is a total jerk, he constantly changes my code without asking and overrides me all the time with his BS arbitrary decisions, should I quit?"* I can understand deciding to outlaw the entire class of career questions because they're frequently soft, opinion-y, and highly specific to the person asking. It's easier to throw out the whole category rather than do the painful work of sifting through them all to reveal those few rare workable gems.
Stack Exchange wants questions that are as useful to as many people as possible, and actively closes (sorry, "puts on hold") the ones that are not. I will now reprint my favorite diagram, ever, which attempts to explain this:
Who does your question apply to?
The colored part in this target that says "All Programmers"? That's the goal at Stack Exchange. Well, maybe "all bicyclists", or "all cooks", but you get the general idea.
We try our best to teach you to ask questions that hit this sweet spot: answers that get you the information you so desperately need, yes, but also help your peers along the way without devolving into meaningless opinion honeypots. Overshoot and you get either "Too Broad" or "Too Localized". Hitting that target with our questions – or at least making a best faith effort to attempt to, anyway – is how we maximize the results of our collective efforts. Write once, read many.
But back to the topic: what career options are available to programmers who no longer want to program? I feel there is a way to answer this question that would be helpful to many other programmers, that is supported by facts and data and science.
Programming is indeed a field that does require some passion. If you've been programming for a few years and haven't developed a taste for it by now, it seems doubtful to me that anyone would suddenly develop one overnight. However, if you were able to stick with doing something you're not very enthusiastic about for a period of years, maybe there's still a kernel of something there to work with. Or perhaps you're just wearing golden handcuffs.
Golden-handcuffs
Environment plays a big part in any job, no matter how intrinsically amazing that job might be. Who do you work with? What are you working on? What kind of environment do you program in:
  • A startup?
  • A small business?
  • A big business?
  • A consultancy?
  • Freelance?
The "programming" in each of these situations, and the other peer programmers you'll be working with, will be radically different. Consider if the environment and peers may be the problem. Have you tried changing those up, first, before conclusively deciding you need to leave the field forever?
Beyond that, there are lots of related fields where programming skills are advantageous, without having "sit down and write code all day" as part of the job description. So let's think. What jobs exist where …
  1. Programming skills and a deep technical background are typically in the hiring requirements.
  2. There is a documented record of ex-programmers moving into these positions and being successful.
  3. There are a reasonable number of such jobs available worldwide.
Here's where I really wished I could have asked this on Stack Exchange, because I'd much rather crowdsource data to support the above three points, but the best I could come up with on my own is:
In many of these roles, people that truly know the nuts and bolts of programming are quite rare. That's unfortunate, because a deep technical background lets you actually understand and explain what is going on, to customers, to business stakeholders, to peers on related teams. At the very least nobody can dazzle you with technical BS, because you're equipped to call their bluff.
I've seen less "adept" programmers self-select into related roles at previous jobs and do very well, both financially and professionally. There is a lot of stuff that goes on around programming that is not heads down code writing, where your programming skills are a competitive advantage.
Career questions are tough, because ultimately only you can decide what's right for you. But if you're a programmer who no longer likes to program, your technical background can at least open the door to a number of related professions.

Nghề BrSE – được và mất


Lời đầu tiên xin chúc anh chị em năm mới sức khoẻ.
Dạo gần đây mình nhận được nhiều câu hỏi từ các bạn trẻ mà hầu hết là sinh viên về nghề. Các em có khá nhiều thắc mắc về hướng đi cũng như những kỹ năng cần bồi đắp. Cảm nhận đầu tiên đó là VUI, Rất vui. Các bạn tuy còn trẻ nhưng lo lắng cho sự nghiệp tương lai như vậy rất ổn. Nhớ hồi xưa bằng tuổi mấy đứa anh còn đang ngụp lặn trong đống game online  kakaka. Tất nhiên là sau đó bỏ được và cố gắng một thời gian dài cày JP (từ năm 4) để …”phục hồi nhân phẩm”, nên sau này ra làm mới có cái mà bon chen với thiên hạ.
Như tiêu đề bài viết, đầu tiên mình muốn mọi người phải xác định được hướng đi này có phù hợp với bản thân hay không rồi mới chọn. Nếu là cá thì nên bơi ra đại dương, chim thì sải cánh mà bay ngang dọc trên trời, đừng làm ngược chi cho tổn thọ. Designer cần tính sáng tạo, Manager cần tố chất quản trị, Sale thì phải lanh lợi – thấu hiểu, Tester cần kỹ tính, Technical Lead thì phải cực giỏi code và một tầm nhìn bao quát về công nghệ. Còn để làm được một kỹ sư cầu nối “chất” không dễ nhưng cũng chẳng khó, và nó cần một yếu tố đặc biệt đó là “chai lì”. Nếu bạn nào tính nóng nảy hoặc dễ bỏ cuộc thì nên stop, chọn hướng khác mà đi. Vì nếu ko chai lì thì khó mà vượt qua cửa ải JP (mất ít nhất 2 năm lên N2), đó là còn chưa nói đến việc trau dồi kỹ năng khác cũng ngốn vài năm nữa. Tương tự nếu dân ngoại ngữ mà chuyển hướng thì cũng tốn vài năm học lập trình.
Nếu cảm thấy phù hợp thì đọc tiếp đoạn sau để biết được mất của nghề, xem nó có đáng để đánh đổi cả thanh xuân hay không nhé

Mất

  1. Tốn công sức học nhiều thứ và nếu không khéo thì không có cái gì ra hồn. JP phải cày lên N2+ chứ me mé tiệm cận cũng vứt vì giao tiếp không ổn ai dám chọn làm cầu nối cả Project. Code, test, kỹ năng quản lý, làm việc nhóm cũng phải tự mà học. Thiếu là mệt lắm. Cái này nói ở các bài trước nhàm rồi nên không nhắc lại nữa.
  2. Xa nhà. Đối với những bạn làm lâu 1 chỗ muốn đi đây đi đó thì cảm thấy hứng thú, còn đi nhiều quá thì lại thèm cảm giác làm gần nhà. Năm hết tết đến, thấy mọi người sum vầy mà mình đang ngồi bên JP fix bug với khách một lần là các bạn sẽ hiểu được cảm giác ngay.
  3. Cơ hội thăng tiến không cao. Nếu các bạn làm ở 1 bộ phận lâu năm, nếu có năng lực trước sau gì cũng sẽ được cất nhắc lên một vị trí cao. Còn với BrSE phải nhảy liên tục từ chỗ này qua chỗ nọ. Không hiếm trường hợp tới kỳ review lương thưởng lại phải gửi CV cho … sếp, vì thực tế toàn ở khách hàng nên người nhà cũng chả biết năng lực mình tới đâu trừ khi anh quá giỏi đến mức lời khen của khách đến tai cấp trên.
  4. Bị o ép trong công việc. Bạn cứ tưởng tượng con cá nằm trên thớt sao thì BrSE vậy đó. Khách là con dao còn team offshore là cái thớt, khách chém mình né là anh em ở nhà có chuyện. Nên nhiều lúc nai lưng ra mà đỡ.
  5. Thời gian hưởng thụ cuộc sống. Những hình ảnh ăn chơi lung linh mà các bạn thấy anh chị em onsite khoe trên “phây” chỉ là khoảnh khắc hiếm hoi tranh thủ ngày lịch đỏ. Còn phần lớn thời gian ai cũng cày bục mặt để chạy đua vs deadline. Nói thật nhiều khi … không được phép ốm, đến mùa phải lo đi tiêm phòng cúm để giữ sức khoẻ mà… OT.
Kể ra cho hết thì nhiều nữa nhưng tạm thời vậy cũng đủ hù doạ rồi

Được

  1. Cơ hội trau dồi kỹ năng trong môi trường khắc nghiệt của các kỹ sư Nhật.
  2. Được đi du lịch trải nghiệm vùng đất mới, ngắm anh đào mùa xuân, ngập trong cánh đồng hoa mùa hạ, dàn dụa lá đỏ mùa thu, bầy nhầy trong tuyết trắng khi đông đến.
  3. Rèn luyện tiếng Nhật trở nên umai (ngọt) như người bản xứ. Sau 5 năm làm brse, nếu lựa chọn về nước mà không muốn code or quản lý thì cũng dư sức làm phiên dịch viên hảo hạng.
  4. Thu nhập ổn định. Thu nhập năm tối thiểu là 350 man, tối đa có thể lên đến trên 600 man/năm. Đủ để lấy vợ sinh con, mua nhà mua xe sau 5 năm mà không cần nhờ cậy ai. Trong khi nếu làm dev/tester or comter sau 5 năm nếu giỏi thì mới lên được Manager, còn năng lực trung bình sẽ rất khó.
  5. Cơ hội định cư tại Nhật. Nếu bạn nào có tư tưởng “bất mãn chế độ” và muốn ra nước ngoài sống thì đây là cơ hội tuyệt vời. Tranh thủ Nhật đang còn nhu cầu thu hút nhân lực mình tận dụng. Đa số những BrSE đã qua nhật trên 5 năm mà mình biết thì đều đã 1 vợ 2 con 3 lầu 4 bánh cả. Mình làm việc có cực 1 chút nhưng con cái được hưởng nền giáo dục tốt, đồ ăn thức uống hay không khí sạch sẽ (hơn so vs VN) thì cũng đáng hy sinh lắm.

Kết

Với những người giàu tham vọng thì những cái được ở trên không đáng gì với họ, nhưng với mình vậy là đủ. Biết đủ là hạnh phúc. Còn các bạn trẻ, nếu có hoài bão ước mơ thì cứ đi theo. Còn đang mông lung chưa tìm lối ra hãy ráng trau dồi chút kỹ năng rồi qua Nhật vài năm, nếu thấy không hợp thì về. Còn trẻ mà lo gì …

[IT読解] Bài 8 : Triển vọng của nghề kỹ sư cầu nối – BrSE

Đây là bài viết hay với phân tích khá chuẩn xác về triển vọng nghề BrSE. Nó nằm trên trang chuyên về tuyển dụng trao đổi BrSE, tất nhiên sẽ có nhiều ý tốt và hạn chế những mặt tối. Trước mắt chúng ta cùng đọc và xem thử mặt phải của nghề là gì, còn mặt trái mình sẽ dành ở 1 bài khác. Khi đọc các bạn hãy để ý cách hành văn của người Nhật, đưa ra câu hỏi mở đề cho người đọc suy nghĩ, bắt đầu phân tích rồi mới đến cảm nhận – đánh giá của tác giả.

オフショアが厳しいとの声は、今に始まったことではありません。一般的にオフショア開発は経済格差を利用したビジネスモデルです。成長著しい国でオフショアをしているのであれば、人件費の高騰で年々厳しくなるのは当然ですよね。大まかにブリッジSEの将来について気になることを箇条書きにしてみました。
  • これだけ中国やASEAN諸国が発展した今、海外で開発するメリットってあるの?
  • ブリッジSEに将来はあるのか?
  • 管理コストやクオリティを考えると日本の田舎で開発した方が得なんじゃないの?
  • 企業はわざわざ海外に発注するリスクを取らず国内志向に変わるのではないか?
  • いまからブリッジSEになるのはリスキーなんじゃないだろうか?
#当記事はオフショア開発をはじめたい企業向けではなく、ブリッジSEになりたい方に向けて書いています。
Việc sử dụng Offshore có nhiều khó khăn là câu chuyện xưa nay chứ không phải giờ mới nói.  Nó là hình thức kinh doanh mang lại lợi nhuận từ sự chênh lệch giá cả thị trường. Nếu làm offshore ở các nước có tốc độ tăng trưởng nóng thì khó khăn do chi phí nhân lực tăng cao năm này qua năm khác là điểu hiển nhiên. Chúng ta hãy thử liệt kê ra các vấn đề được quan tâm về tương lai của ngành kỹ sư cầu nối.
  • Hiện tại thì Trung Quốc và các nước Asean đã rất phát triển thì có lợi ích gì trong việc outsource ở nước ngoài không?
  • Tương lai ngành kỹ sư cầu nối sẽ thế nào?
  • Chi phí quản lý và chất lượng nếu phát triển ở các vùng ngoại ô của Nhật bản thì có lợi ích gì không ?
  • Phải chăng các doanh nghiệp chuyển sang hướng phát triển trong nước để tránh rủi ro phát sinh ở nước ngoài
  • Trong tương lai nghề Kỹ sư cầu nối có những rủi ro gì không?
Trong bài báo này không hướng đến các doanh nghiệp muốn phát triển ở offshore mà chỉ dành cho những ai muốn trở thành Kỹ sư cầu nối.

発展途上国の成長 – Sự trỗi dậy của các nước đang phát triển

東南アジアとはじめとする発展途上国は急速に発展しています。ほんの数年でガラリと変わってしまう都市をみるだけで、年々賃金格差が埋まっていることがよく分かります。
成長著しい国を知ると、ブリッジSEを目指しても大丈夫なのか、と心配になりますよね。
Các nước đông nam á mà cụ thể là các nước đang phát triển đang đi lên với tốc độ rất nhanh. Nhìn các thành phố đang thay da đổi thịt trong mấy năm gần đây, chúng ta có thể thấy rõ khoảng cách tiền lương được thu hẹp dần năm này qua năm khác . Vậy khi hiểu được tình hình của các nước đang tăng trưởng nóng với mức sống cũng như thu nhập đang cao dần lên như vậy, ắt hẳn các bạn cũng đang rất băn khoăn liệu có nên theo nghề BrSE hay không đúng không nhỉ

発展途上国のITエンジニアの給与が上昇しやすいワケ – Lí do thu nhập của những IT Engineer ở những nước đang phát triển dễ tăng lên

ITの仕事に国境はありません。例えば、世界のphpプログラマは同じ土俵にいます。もちろん国により人気のフレームワークや言語がありますが、ほぼ同じ仕事をしています。
労働ビザや許可証の問題はさて置き、コミュニケーションツールとしての言葉の問題さえクリアしてしまえば、どの国でも仕事ができるのがITエンジニアのメリットです。仕事を依頼する立場からみるとよくわかるのですが、ITほど発展途上国に振りやすい仕事は他にありません。これは日本で働くエンジニアの給与が上がらない理由でもあります。日本語が話せるという価値以上に違いがあればよいのですが・・・ブリッジSEの話に戻しましょう。
オフショア開発が広がっていくなかで避けて通ることができない問題があります。
発展途上国にいるデキるエンジニアの奪い合いと賃金の上昇。発展途上国のITエンジニアの需要は高まるばかりです。東南アジアやインドでオフショア開発をしている経営者から悲痛な叫びが聞こえてきます。
Công việc IT thì không có biên giới. Ví dụ như, ngôn ngữ php thì nó đang ở cùng 1 cộng đồng trên toàn cầu. Tất nhiên là tùy vào từng quốc gia mà ngôn ngữ và framework được ưa chuộng khác nhau. Nhưng phần lớn là làm công việc giống nhau. Tạm thời không nhắc tới giấy phép và visa lao động, nếu giải quyết được vấn đề ngôn ngữ trong giao tiếp, thì rõ ràng ưu điểm của IT Engineer là có thể làm việc được ở bất kỳ quốc gia nào.
Nhìn từ góc độ của các doanh nghiệp chuyên khoán ngoài sẽ hiểu rất rõ, ở những quốc gia đang phát triển thì hiếm nghành nghề nào outsource lại dễ dàng như IT . Đó cũng là lý do mà thu nhập của những IT Engineer làm việc ở nhật không tăng. Nếu như có lợi thế khác ngoài việc có thể nói tiếng Nhật ra thì tốt biết mấy, à mà thôi … Quay lại câu chuyện về BrSE.
Những vấn đề không thể bỏ qua khi mở rộng phát triển offshore :
  • Việc tuyển dụng những kỹ sư có kỹ năng từ các nước đang phát triển và việc tăng lương.
  • Nhu cầu về kỹ sư IT ở các nước đang phát triển ngày càng tăng cao.
  • Sự than phiền từ những nhà đầu tư phát triển đội offshore tại Ấn độ và Đông nam á về vấn đề mất nguồn nhân lực.
発展途上国に仕事を依頼するのは日本だけではありません。欧米の企業もこぞって東南アジアに進出しています。できるエンジニアはひっぱりダコです。数年で給与が倍になるようなケースも珍しくありません。かつて私の部下として仕事をしていたスタッフは5年で4倍も給与が上がっています。夢がある世界ですね。
Những nước thuê outsource thì không chỉ có Nhật Bản. Các doanh nghiệp ở Âu Mĩ cũng đang dần tiến vào thị trường đông nam á. Engineer có năng lực thì luôn được săn đón. Và trong vài năm trường hợp mức lương tăng lên mức gấp bội cũng không còn là hiếm. Như nhân viên cấp dưới của tôi thì trong 5 năm lương đã tăng gấp 4 lần. IT đúng là nghề trong mơ ^^! (TigerNguyen : I don’t think so  )

物価が上昇してしまったら – Nếu vật giá tăng.

経営者としてみるとオフショア拠点の賃金上昇は死を意味します。より付加価値の高いサービスが提供できるのであれば生き残っていけます。しかし、デキるエンジニアほど好待遇を求めて転職してしまうことから、サービスの品質を維持するのがやっとです。
オフショア拠点の賃金が上昇してしまった場合は、賃金の安い地方都市にオフィス移転したり、さらに単価の安い国を求めて移転します。
  • 地方都市への展開
  • さらに物価の安い国へ
Dưới cái nhìn của 1 nhà kinh doanh thì việc tăng giá offshore đồng nghĩa với cái chết. Bạn chỉ có thể tồn tại nếu cung cấp được những dịch vụ chất lượng cao mang lại doanh thu lớn hơn so với vốn bỏ ra. Tuy nhiên, vì các kỹ sư làm được việc thì họ cũng muốn tìm kiếm và chuyển đến những nơi có đãi ngộ tốt, nên việc duy trì chất lượng dịch vụ vẫn là vấn đề lớn. Nhưng nếu offshore đòi tăng giá thì có thể những người thuê outsource sẽ chuyển việc đến những thành phố địa phương có mức lương rẻ hơn, thậm chí là đưa đến các quốc gia có mức sống thấp hơn. Có 2 lựa chọn :
  • Triển khai đến thành phố địa phương.
  • Di chuyển đến những quốc gia có vật giá rẻ hơn.

ブリッジSEの今後について – Tương lai của nghề BrSE

日本にITがなくならないかぎり安い人件費を求めて海外の開発拠点は移り変わっていくでしょう。製造業と同じです。ただ製造業より拠点を作るのに資金が必要というわけではありません。オフィスと回線さえあればできるのがオフショアです。今後、より多くの企業が海外を目指すのは間違いありません。
まとめ:ブリッジSEは製造業と同じように経済格差があるかぎりなくならない仕事です。
ブリッジSEの求人は一般公開されないことが多いのはご存知でしょうか。求人は一般的な求職サイトで探すのではなくエージェントを利用するべきです。海外のITに強い人材紹介会社をリストアップしてありますので参考にして下さい。
Nếu ngành IT ở nhật không ngỏm thì có lẽ sẽ dần dần chuyển sang phát triển đội offshore ở nước ngoài – nơi có nhân lực giá rẻ. Giống như những ngành chế tạo. Tuy nhiên vốn đầu tư để xây dựng đội offshore thì không đòi hỏi nhiều như những ngành chế tạo. Offshore chỉ cần một văn phòng và mạng Internet. Trong tương lai, không còn nghi ngờ gì nữa, các công ty sẽ hướng đến việc phát triển ở ngoài nước.
Tóm lại: Như những ngành sản xuất, BrSE cũng là 1 ngành sẽ vẫn tồn tại nếu khoảng cách phát triển kinh tế vẫn còn.
Bạn có biết là thông tin tuyển dụng ngành BrSE thì phần lớn là không được công khai ? Nên sử dụng những công ty môi giới chứ không tìm kiếm trên các trang tuyển dụng thông thường (TigerNguyen : Đoạn này PR cho công ty của họ thôi, anh em cứ kết hợp nhiều kênh cho chắc, không nên tin tuyệt đối vào cái gì) . Tôi cũng đã list ra danh sách những công ty giới thiệu nhân lực mạnh về ngành IT ở nước ngoài. Hãy tham khảo nhé.
Link : http://bridge-se-navi.com/future/

Joel on Software: The Development Abstraction Layer (ưu tiên hàng đầu trong 1 cty phần mềm là tạo ra 1 môi trường tốt nhất cho dev)

A young man comes to town. He is reasonably good looking, has a little money in his pocket. He finds it easy to talk to women.
He doesn’t speak much about his past, but it is clear that he spent a lot of time in a soulless big company.
He is naturally friendly and outgoing, and quietly confident without being arrogant. So he finds it easy to pick up small gigs from the job board at the local Programmer’s Cafe. But he rapidly loses interest in insurance database projects, vanity web pages for housewives, and financial calculation engines.
After a year, he calculates that he has saved up enough money to pay his modest expenses for a year. So, after consulting with his faithful Alsatian, he sets up a computer in a sunfilled room in his rented apartment above the grocery store and installs a carefully-chosen selection of tools.
One by one, he calls his friends and warns them that if he seems remote over the next months, it is only because he is hard at work.
And he sits down to spin code.
And what code it is. Flawless, artistic, elegant, bug free. The user interface so perfectly mimics a users’ thought process that the people he shows it to at the Programmer’s Cafe hardly notice that there is a user interface. It’s a brilliant piece of work.
Encouraged by the feedback of his peers, he sets up in business and prepares to take orders.
His modesty precludes any pretensions, but after a month, the situation in his bank account is not looking encouraging. So far only three orders have been taken: one from his mother, one from an anonymous benefactor at the Programmer’s Cafe, and the one he submitted himself to test the commerce system.
In the second month, no more orders come in.
This surprises him and leaves him feeling melancholy. At the big company, new products were created on a regular basis, and even if they were inelegant and homely, they still sold in reasonable quantities. One product he worked on there went on to be a big hit.
After a few more months pass, his financial situation starts to look a little bit precarious. His dog looks at him sadly, not quite certain what is wrong, but aware that his face is looking a little bit gaunter than usual, and he seems to be unable to get up the energy to go out with friends, or go shopping to restock the dangerously low larder, or even to bathe.
One Tuesday morning, the local grocer has refused to extend him any more credit, and his banker has long since refused to return his calls.
The big company is not vindictive. They recognize talent, and are happy to hire him back, at a higher salary. Soon he is looking better, he has some new clothes, and he’s got his old confidence back. But something, somewhere, is missing. A spark in his eye. The hope that he might become the master of his own destiny is gone.
Why did he fail? He’s pretty sure he knows. “Marketing,” he says. Like many young technicians, he is apt to say things like, “Microsoft has worse products but better marketing.”
When uttered by a software developer, the term “marketing” simply stands in for all that business stuff: everything they don’t actually understand about creating software and selling it.
This, actually, is not really what “marketing” means. Actually Microsoft has pretty terrible marketing. Can you imagine those dinosaur ads actually making someone want to buy Microsoft Office?
Software is a conversation, between the software developer and the user. But for that conversation to happen requires a lot of work beyond the software development. It takes marketing, yes, but also sales, and public relations, and an office, and a network, and infrastructure, and air conditioning in the office, and customer service, and accounting, and a bunch of other support tasks.
But what do software developers do? They design and write code, they layout screens, they debug, they integrate, and they check things into the source code control repository.
The level a programmer works at (say, Emacs) is too abstract to support a business. Developers working at the developer abstraction layer need an implementation layer — an organization that takes their code and turns it into products. Dolly Parton, working at the “singing a nice song” layer, needs a huge implementation layer too, to make the records and book the concert halls and take the tickets and set up the audio gear and promote the records and collect the royalties.
Any successful software company is going to consist of a thin layer of developers, creating software, spread across the top of a big abstract administrative organization.
The abstraction exists solely to create the illusion that the daily activities of a programmer (design and writing code, checking in code, debugging, etc.) are all that it takes to create software products and bring them to market. Which gets me to the most important point of this essay:
Your first priority as the manager of a software team is building the development abstraction layer.
Most new software managers miss this point. They keep thinking of the traditional, Command-and-Conquer model of management that they learned from Hollywood movies.
According to Command-and-Conquer, managers-slash-leaders figure out where the business is going to go, and then issue the appropriate orders to their lieutenants to move the business in that direction. Their lieutenants in turn divide up the tasks into smaller chunks and command their reports to implement them. This continues down the org-chart until eventually someone at the bottom actually does some work. In this model, a programmer is a cog in the machine: a typist who carries out one part of management’s orders.
Some businesses actually run this way. You can always tell when you are dealing with such a business, because the person you are talking to is doing something infuriating and senseless, and they know it, and they might even care, but there’s nothing they can do about it. It’s the airline that loses a million mile customer forever because they refuse to change his non-refundable ticket so he can fly home for a family emergency. It’s the ISP whose service is down more often than it’s up, and when you cancel your account, they keep billing you, and billing you, and billing you, but when you call to complain, you have to call a toll number and wait on hold for an hour, and then they still refuse to refund you, until you start a blog about how badly they suck. It’s the Detroit automaker that long since forgot how to design cars that people might want to buy and instead lurches from marketing strategy to marketing strategy, as if the only reason we don’t buy their crappy cars is because the rebate wasn’t big enough.
Enough.
Forget it. The command-hierarchy system of management has been tried, and it seemed to work for a while in the 1920s, competing against peddlers pushing carts, but it’s not good enough for the 21st century. For software companies, you need to use a different model.
With a software company, the first priority of management needs to be creating that abstraction for the programmers.
If a programmer somewhere is worrying about a broken chair, or waiting on hold with Dell to order a new computer, the abstraction has sprung a leak.
Think of your development abstraction layer as a big, beautiful yacht with insanely powerful motors. It’s impeccably maintained. Gourmet meals are served like clockwork. The staterooms have twice-daily maid service. The navigation maps are always up to date. The GPS and the radar always work and if they break there’s a spare below deck. Standing on the bridge, you have programmers who really only think about speed, direction, and whether to have Tuna or Salmon for lunch. Meanwhile a large team of professionals in starched white uniforms tiptoes around quietly below deck, keeping everything running, filling the gas tanks, scraping off barnacles, ironing the napkins for lunch. The support staff knows what to do but they take their cues from a salty old fart who nods ever so slightly in certain directions to coordinate the whole symphony so that the programmers can abstract away everything about the yacht except speed, direction, and what they want for lunch.
Management, in a software company, is primarily responsible for creating abstractions for programmers. We build the yacht, we service the yacht, we are the yacht, but we don’t steer the yacht. Everything we do comes down to providing a non-leaky abstraction for the programmers so that they can create great code and that code can get into the hands of customers who benefit from it.
Programmers need a Subversion repository. Getting a Subversion repository means you need a network, and a server, which has to be bought, installed, backed up, and provisioned with uninterruptible power, and that server generates a lot of heat, which means it need to be in a room with an extra air conditioner, and that air conditioner needs access to the outside of the building, which means installing an 80 pound fan unit on the wall outside the building, which makes the building owners nervous, so they need to bring their engineer around, to negotiate where the air conditioner unit will go (decision: on the outside wall, up here on the 18th floor, at the most inconvenient place possible), and the building gets their lawyers involved, because we’re going to have to sign away our firstborn to be allowed to do this, and then the air conditioning installer guys show up with rigging gear that wouldn’t be out of place in a Barbie play-set, which makes our construction foreman nervous, and he doesn’t allow them to climb out of the 18th floor window in a Mattel harness made out of 1/2″ pink plastic, I swear to God it could be Disco Barbie’s belt, and somebody has to call the building agent again and see why the hell they suddenly realized, 12 weeks into a construction project, that another contract amendment is going to be needed for this goddamned air conditioner that they knew about before Christmas and they only just figured it out, and if your programmers even spend one minute thinking about this that’s one minute too many.
To the software developers on your team, this all needs to be abstracted away as typing svn commit on the command line.
That’s why you have management.
It’s for the kind of stuff that no company can avoid, but if you have your programmers worrying about it, well, management has failed, the same way as a 100 foot yacht has failed if the millionaire owner has to go down into the engine room and, um, build the engine.
You’ve got your typical company started by ex-software salesmen, where everything is Sales Sales Sales and we all exist to drive more sales. These companies can be identified in the wild because they build version 1.0 of the software (somehow) and then completely lose interest in developing new software. Their development team is starved or nonexistent because it never occurred to anyone to build version 2.0… all that management knows how to do is drive more sales.
On the other extreme you have typical software companies built by ex-programmers. These companies are harder to find because in most circumstances they keep quietly to themselves, polishing code in a garret somewhere, which nobody ever finds, and so they fade quietly into oblivion right after the Great Ruby Rewrite, their earth-changing refactoring-code code somehow unappreciated by The People.
Both of these companies can easily be wiped out by a company that’s driven by programmers and organized to put programmers in the driver’s seat, but which have an excellent abstraction that does all the hard work to convert code into products below the decks.
A programmer is most productive with a quiet private office, a great computer, unlimited beverages, an ambient temperature between 68 and 72 degrees (F), no glare on the screen, a chair that’s so comfortable you don’t feel it, an administrator that brings them their mail and orders manuals and books, a system administrator who makes the Internet as available as oxygen, a tester to find the bugs they just can’t see, a graphic designer to make their screens beautiful, a team of marketing people to make the masses want their products, a team of sales people to make sure the masses can get these products, some patient tech support saints who help customers get the product working and help the programmers understand what problems are generating the tech support calls, and about a dozen other support and administrative functions which, in a typical company, add up to about 80% of the payroll. It is not a coincidence that the Roman army had a ratio of four servants for every soldier. This was not decadence. Modern armies probably run 7:1. (Here’s something Pradeep Singh taught me today: if only 20% of your staff is programmers, and you can save 50% on salary by outsourcing programmers to India, well, how much of a competitive advantage are you really going to get out of that 10% savings?)
Management’s primary responsibility to create the illusion that a software company can be run by writing code, because that’s what programmers do. And while it would be great to have programmers who are also great at sales, graphic design, system administration, and cooking, it’s unrealistic. Like teaching a pig to sing, it wastes your time and it annoys the pig.
Microsoft does such a good job at creating this abstraction that Microsoft alumni have a notoriously hard time starting companies. They simply can’t believe how much went on below decks and they have no idea how to reproduce it.
Nobody expects Dolly Parton to know how to plug in a microphone. There’s an incredible infrastructure of managers, musicians, recording technicians, record companies, roadies, hairdressers, and publicists behind her who exist to create the abstraction that when she sings, that’s all it takes for millions of people to hear her song. All the support staff and management that make Dolly Parton possible can do their jobs best by providing the most perfect abstraction: the most perfect illusion that Dolly sings for us. It is her song. When you’re listening to her on your iPod, there’s a huge infrastructure that makes that possible, but the very best thing that infrastructure can do is disappear completely. Provide a leakproof abstraction that Dolly Parton is singing, privately, to us.

Joel on Software: The Perils of JavaSchools (học java không học C là bỏ qua những năng lực tư duy cơ bản của lập trình: con trỏ và đệ quy)

Lazy kids.
Whatever happened to hard work?
A sure sign of my descent into senility is bitchin’ and moanin’ about “kids these days,” and how they won’t or can’t do anything hard any more.
“You were lucky. We lived for three months in a brown paper bag in a septic tank. We had to get up at six in the morning, clean the bag, eat a crust of stale bread, go to work down the mill, fourteen hours a day, week-in week-out, and when we got home our Dad would thrash us to sleep with his belt.” — Monty Python’s Flying Circus, Four Yorkshiremen
When I was a kid, I learned to program on punched cards. If you made a mistake, you didn’t have any of these modern features like a backspace key to correct it. You threw away the card and started over.
When I started interviewing programmers in 1991, I would generally let them use any language they wanted to solve the coding problems I gave them. 99% of the time, they chose C.
Nowadays, they tend to choose Java.
Now, don’t get me wrong: there’s nothing wrong with Java as an implementation language.
Wait a minute, I want to modify that statement. I’m not claiming, in this particular article, that there’s anything wrong with Java as an implementation language. There are lots of things wrong with it but those will have to wait for a different article.
Instead what I’d like to claim is that Java is not, generally, a hard enough programming language that it can be used to discriminate between great programmers and mediocre programmers. It may be a fine language to work in, but that’s not today’s topic. I would even go so far as to say that the fact that Java is not hard enough is a feature, not a bug, but it does have this one problem.
If I may be so brash, it has been my humble experience that there are two things traditionally taught in universities as a part of a computer science curriculum which many people just never really fully comprehend: pointers and recursion.
You used to start out in college with a course in data structures, with linked lists and hash tables and whatnot, with extensive use of pointers. Those courses were often used as weedout courses: they were so hard that anyone that couldn’t handle the mental challenge of a CS degree would give up, which was a good thing, because if you thought pointers are hard, wait until you try to prove things about fixed point theory.
All the kids who did great in high school writing pong games in BASIC for their Apple II would get to college, take CompSci 101, a data structures course, and when they hit the pointers business their brains would just totally explode, and the next thing you knew, they were majoring in Political Science because law school seemed like a better idea. I’ve seen all kinds of figures for drop-out rates in CS and they’re usually between 40% and 70%. The universities tend to see this as a waste; I think it’s just a necessary culling of the people who aren’t going to be happy or successful in programming careers.
The other hard course for many young CS students was the course where you learned functional programming, including recursive programming. MIT set the bar very high for these courses, creating a required course (6.001) and a textbook (Abelson & Sussman’s Structure and Interpretation of Computer Programs) which were used at dozens or even hundreds of top CS schools as the de facto introduction to computer science. (You can, and should, watch an older version of the lectures online.)
The difficulty of these courses is astonishing. In the first lecture you’ve learned pretty much all of Scheme, and you’re already being introduced to a fixed-point function that takes another function as its input. When I struggled through such a course, CSE121 at Penn, I watched as many if not most of the students just didn’t make it. The material was too hard. I wrote a long sob email to the professor saying It Just Wasn’t Fair. Somebody at Penn must have listened to me (or one of the other complainers), because that course is now taught in Java.
I wish they hadn’t listened.
Think you have what it takes? Test Yourself Here!
Therein lies the debate. Years of whinging by lazy CS undergrads like me, combined with complaints from industry about how few CS majors are graduating from American universities, have taken a toll, and in the last decade a large number of otherwise perfectly good schools have gone 100% Java. It’s hip, the recruiters who use “grep” to evaluate resumes seem to like it, and, best of all, there’s nothing hard enough about Java to really weed out the programmers without the part of the brain that does pointers or recursion, so the drop-out rates are lower, and the computer science departments have more students, and bigger budgets, and all is well.
The lucky kids of JavaSchools are never going to get weird segfaults trying to implement pointer-based hash tables. They’re never going to go stark, raving mad trying to pack things into bits. They’ll never have to get their head around how, in a purely functional program, the value of a variable never changes, and yet, it changes all the time! A paradox!
They don’t need that part of the brain to get a 4.0 in major.
Am I just one of those old-fashioned curmudgeons, like the Four Yorkshiremen, bragging about how tough I was to survive all that hard stuff?
Heck, in 1900, Latin and Greek were required subjects in college, not because they served any purpose, but because they were sort of considered an obvious requirement for educated people. In some sense my argument is no different that the argument made by the pro-Latin people (all four of them). “[Latin] trains your mind. Trains your memory. Unraveling a Latin sentence is an excellent exercise in thought, a real intellectual puzzle, and a good introduction to logical thinking,” writes Scott Barker. But I can’t find a single university that requires Latin any more. Are pointers and recursion the Latin and Greek of Computer Science?
Now, I freely admit that programming with pointers is not needed in 90% of the code written today, and in fact, it’s downright dangerous in production code. OK. That’s fine. And functional programming is just not used much in practice. Agreed.
But it’s still important for some of the most exciting programming jobs. Without pointers, for example, you’d never be able to work on the Linux kernel. You can’t understand a line of code in Linux, or, indeed, any operating system, without really understanding pointers.
Without understanding functional programming, you can’t invent MapReduce, the algorithm that makes Google so massively scalable. The terms Map and Reduce come from Lisp and functional programming. MapReduce is, in retrospect, obvious to anyone who remembers from their 6.001-equivalent programming class that purely functional programs have no side effects and are thus trivially parallelizable. The very fact that Google invented MapReduce, and Microsoft didn’t, says something about why Microsoft is still playing catch up trying to get basic search features to work, while Google has moved on to the next problem: building Skynet^H^H^H^H^H^H the world’s largest massively parallel supercomputer. I don’t think Microsoft completely understands just how far behind they are on that wave.
But beyond the prima-facie importance of pointers and recursion, their real value is that building big systems requires the kind of mental flexibility you get from learning about them, and the mental aptitude you need to avoid being weeded out of the courses in which they are taught. Pointers and recursion require a certain ability to reason, to think in abstractions, and, most importantly, to view a problem at several levels of abstraction simultaneously. And thus, the ability to understand pointers and recursion is directly correlated with the ability to be a great programmer.
Nothing about an all-Java CS degree really weeds out the students who lack the mental agility to deal with these concepts. As an employer, I’ve seen that the 100% Java schools have started churning out quite a few CS graduates who are simply not smart enough to work as programmers on anything more sophisticated than Yet Another Java Accounting Application, although they did manage to squeak through the newly-dumbed-down coursework. These students would never survive 6.001 at MIT, or CS 323 at Yale, and frankly, that is one reason why, as an employer, a CS degree from MIT or Yale carries more weight than a CS degree from Duke, which recently went All-Java, or U. Penn, which replaced Scheme and ML with Java in trying to teach the class that nearly killed me and my friends, CSE121. Not that I don’t want to hire smart kids from Duke and Penn — I do — it’s just a lot harder for me to figure out who they are. I used to be able to tell the smart kids because they could rip through a recursive algorithm in seconds, or implement linked-list manipulation functions using pointers as fast as they could write on the whiteboard. But with a JavaSchool Grad, I can’t tell if they’re struggling with these problems because they are undereducated or if they’re struggling with these problems because they don’t actually have that special part of the brain that they’re going to need to do great programming work. Paul Graham calls them Blub Programmers.
It’s bad enough that JavaSchools fail to weed out the kids who are never going to be great programmers, which the schools could justifiably say is not their problem. Industry, or, at least, the recruiters-who-use-grep, are surely clamoring for Java to be taught.
But JavaSchools also fail to train the brains of kids to be adept, agile, and flexible enough to do good software design (and I don’t mean OO “design”, where you spend countless hours rewriting your code to rejiggle your object hierarchy, or you fret about faux “problems” like has-a vs. is-a). You need training to think of things at multiple levels of abstraction simultaneously, and that kind of thinking is exactly what you need to design great software architecture.
You may be wondering if teaching object oriented programming (OOP) is a good weed-out substitute for pointers and recursion. The quick answer: no. Without debating OOP on the merits, it is just not hard enough to weed out mediocre programmers. OOP in school consists mostly of memorizing a bunch of vocabulary terms like “encapsulation” and “inheritance” and taking multiple-choice quizzicles on the difference between polymorphism and overloading. Not much harder than memorizing famous dates and names in a history class, OOP poses inadequate mental challenges to scare away first-year students. When you struggle with an OOP problem, your program still works, it’s just sort of hard to maintain. Allegedly. But when you struggle with pointers, your program produces the line Segmentation Fault and you have no idea what’s going on, until you stop and take a deep breath and really try to force your mind to work at two different levels of abstraction simultaneously.
The recruiters-who-use-grep, by the way, are ridiculed here, and for good reason. I have never met anyone who can do Scheme, Haskell, and C pointers who can’t pick up Java in two days, and create better Java code than people with five years of experience in Java, but try explaining that to the average HR drone.
But what about the CS mission of CS departments? They’re not vocational schools! It shouldn’t be their job to train people to work in industry. That’s for community colleges and government retraining programs for displaced workers, they will tell you. They’re supposed to be giving students the fundamental tools to live their lives, not preparing them for their first weeks on the job. Right?
Card Punch -- yes, I learned Fortran on one of these when I was 12.Still. CS is proofs (recursion), algorithms (recursion), languages (lambda calculus), operating systems (pointers), compilers (lambda calculus) — and so the bottom line is that a JavaSchool that won’t teach C and won’t teach Scheme is not really teaching computer science, either. As useless as the concept of function currying may be to the real world, it’s obviously a prereq for CS grad school. I can’t understand why the professors on the curriculum committees at CS schools have allowed their programs to be dumbed down to the point where not only can’t they produce working programmers, they can’t even produce CS grad students who might get PhDs and compete for their jobs. Oh wait. Never mind. Maybe I do understand.
Actually if you go back and research the discussion that took place in academia during the Great Java Shift, you’ll notice that the biggest concern was whether Java was simple enough to use as a teaching language.
My God, I thought, they’re trying to dumb down the curriculum even further! Why not spoon feed everything to the students? Let’s have the TAs take their tests for them, too, then nobody will switch to American Studies. How is anyone supposed to learn anything if the curriculum has been carefully designed to make everything easier than it already is? There seems to be a task force underway (PDF) to figure out a simple subset of Java that can be taught to students, producing simplified documentation that carefully hides all that EJB/J2EE crap from their tender minds, so they don’t have to worry their little heads with any classes that you don’t need to do the ever-easier CS problem sets.
The most sympathetic interpretation of why CS departments are so enthusiastic to dumb down their classes is that it leaves them more time to teach actual CS concepts, if they don’t need to spend two whole lectures unconfusing students about the difference between, say, a Java int and an Integer. Well, if that’s the case, 6.001 has the perfect answer for you: Scheme, a teaching language so simple that the entire language can be taught to bright students in about ten minutes; then you can spend the rest of the semester on fixed points.
Feh.
I’m going back to ones and zeros.
(You had ones? Lucky bastard! All we got were zeros.)
Are you a Junior in college who can rip through a recursive algorithm in seconds, or implement linked-list manipulation functions using pointers as fast as you can write on the whiteboard? Check out our summer internships in New York City! Applications are due February 1st.

Joel on Software:How Microsoft Lost the API War (câu chuyện về Microsoft, hay là về các version mới của HĐH và backward compatibility)

Here’s a theory you hear a lot these days: “Microsoft is finished. As soon as Linux makes some inroads on the desktop and web applications replace desktop applications, the mighty empire will topple.”
Although there is some truth to the fact that Linux is a huge threat to Microsoft, predictions of the Redmond company’s demise are, to say the least, premature. Microsoft has an incredible amount of cash money in the bank and is still incredibly profitable. It has a long way to fall. It could do everything wrong for a decade before it started to be in remote danger, and you never know… they could reinvent themselves as a shaved-ice company at the last minute. So don’t be so quick to write them off. In the early 90s everyone thought IBM was completely over: mainframes were history! Back then, Robert X. Cringely predicted that the era of the mainframe would end on January 1, 2000 when all the applications written in COBOL would seize up, and rather than fix those applications, for which, allegedly, the source code had long since been lost, everybody would rewrite those applications for client-server platforms.
Well, guess what. Mainframes are still with us,  nothing happened on January 1, 2000, and IBM reinvented itself as a big ol’ technology consulting company that also happens to make cheap plastic telephones. So extrapolating from a few data points to the theory that Microsoft is finished is really quite a severe exaggeration.
However, there is a less understood phenomenon which is going largely unnoticed: Microsoft’s crown strategic jewel, the Windows API, is lost. The cornerstone of Microsoft’s monopoly power and incredibly profitable Windows and Office franchises, which account for virtually all of Microsoft’s income and covers up a huge array of unprofitable or marginally profitable product lines, the Windows API  is no longer of much interest to developers. The goose that lays the golden eggs is not quite dead, but it does have a terminal disease, one that nobody noticed yet.
Now that I’ve said that, allow me to apologize for the grandiloquence and pomposity of that preceding paragraph. I think I’m starting to sound like those editorial writers in the trade rags who go on and on about Microsoft’s strategic asset, the Windows API. It’s going to take me a few pages, here, to explain what I’m really talking about and justify my arguments. Please don’t jump to any conclusions until I explain what I’m talking about. This will be a long article. I need to explain what the Windows API is; I need to demonstrate why it’s the most important strategic asset to Microsoft; I need to explain how it was lost and what the implications of that are in the long term. And because I’m talking about big trends, I need to exaggerate and generalize.

Developers, Developers, Developers, Developers

Remember the definition of an operating system? It’s the thing that manages a computer’s resources so that application programs can run. People don’t really care much about operating systems; they care about those application programs that the operating system makes possible. Word Processors. Instant Messaging. Email. Accounts Payable. Web sites with pictures of Paris Hilton. By itself, an operating system is not that useful. People buy operating systems because of the useful applications that run on it. And therefore the most useful operating system is the one that has the most useful applications.
The logical conclusion of this is that if you’re trying to sell operating systems, the most important thing to do is make software developers want to develop software for your operating system. That’s why Steve Ballmer was jumping around the stage shouting “Developers, developers, developers, developers.” It’s so important for Microsoft that the only reason they don’t outright give away development tools for Windows is because they don’t want to inadvertently cut off the oxygen to competitive development tools vendors (well, those that are left) because having a variety of development tools available for their platform makes it that much more attractive to developers. But they really want to give away the development tools. Through their Empower ISV program you can get five complete sets of MSDN Universal (otherwise known as “basically every Microsoft product except Flight Simulator“) for about $375. Command line compilers for the .NET languages are included with the free .NET runtime… also free. The C++ compiler is now free. Anything to encourage developers to build for the .NET platform, and holding just short of wiping out companies like Borland.

Why Apple and Sun Can’t Sell Computers

Well, of course, that’s a little bit silly: of course Apple and Sun can sell computers, but not to the two most lucrative markets for computers, namely, the corporate desktop and the home computer. Apple is still down there in the very low single digits of market share and the only people with Suns on their desktops are at Sun. (Please understand that I’m talking about large trends here, and therefore when I say things like “nobody” I really mean “fewer than 10,000,000 people,” and so on and so forth.)
Why? Because Apple and Sun computers don’t run Windows programs, or, if they do, it’s in some kind of expensive emulation mode that doesn’t work so great. Remember, people buy computers for the applications that they run, and there’s so much more great desktop software available for Windows than Mac that it’s very hard to be a Mac user.
Sidebar What is this “API” thing?
If you’re writing a program, say, a word processor, and you want to display a menu, or write a file, you have to ask the operating system to do it for you, using a very specific set of function calls which are different on every operating system. These function calls are called the API: it’s the interface that an operating system, like Windows, provides to application developers, like the programmers building word processors and spreadsheets and whatnot. It’s a set of thousands and thousands of detailed and fussy functions and subroutines that programmers can use, which cause the operating system to do interesting things like display a menu, read and write files, and more esoteric things like find out how to spell out a given date in Serbian, or extremely complex things like display a web page in a window. If your program uses the API calls for Windows, it’s not going to work on Linux, which has different API calls. Sometimes they do approximately the same thing. That’s one important reason Windows software doesn’t run on Linux. If you wanted to get a Windows program to run under Linux, you’d have to reimplement the entire Windows API, which consists of thousands of complicated functions: this is almost as much work as implementing Windows itself, something which took Microsoft thousands of person-years. And if you make one tiny mistake or leave out one function that an application needs, that application will crash.
And that’s why the Windows API is such an important asset to Microsoft.
(I know, I know, at this point the 2.3% of the world that uses Macintoshes are warming up their email programs to send me a scathing letter about how much they love their Macs. Once again, I’m speaking in large trends and generalizing, so don’t waste your time. I know you love your Mac. I know it runs everything you need. I love you, you’re a Pepper, but you’re only 2.3% of the world, so this article isn’t about you.)

The Two Forces at Microsoft

There are two opposing forces inside Microsoft, which I will refer to, somewhat tongue-in-cheek, as The Raymond Chen Camp and The MSDN Magazine Camp.
Raymond Chen is a developer on the Windows team at Microsoft. He’s been there since 1992, and his weblog The Old New Thing is chock-full of detailed technical stories about why certain things are the way they are in Windows, even silly things, which turn out to have very good reasons.
The most impressive things to read on Raymond’s weblog are the stories of the incredible efforts the Windows team has made over the years to support backwards compatibility:
Look at the scenario from the customer’s standpoint. You bought programs X, Y and Z. You then upgraded to Windows XP. Your computer now crashes randomly, and program Z doesn’t work at all. You’re going to tell your friends, “Don’t upgrade to Windows XP. It crashes randomly, and it’s not compatible with program Z.” Are you going to debug your system to determine that program X is causing the crashes, and that program Z doesn’t work because it is using undocumented window messages? Of course not. You’re going to return the Windows XP box for a refund. (You bought programs X, Y, and Z some months ago. The 30-day return policy no longer applies to them. The only thing you can return is Windows XP.)
I first heard about this from one of the developers of the hit game SimCity, who told me that there was a critical bug in his application: it used memory right after freeing it, a major no-no that happened to work OK on DOS but would not work under Windows where memory that is freed is likely to be snatched up by another running application right away. The testers on the Windows team were going through various popular applications, testing them to make sure they worked OK, but SimCity kept crashing. They reported this to the Windows developers, who disassembled SimCity, stepped through it in a debugger, found the bug, and added special code that checked if SimCity was running, and if it did, ran the memory allocator in a special mode in which you could still use memory after freeing it.
This was not an unusual case. The Windows testing team is huge and one of their most important responsibilities is guaranteeing that everyone can safely upgrade their operating system, no matter what applications they have installed, and those applications will continue to run, even if those applications do bad things or use undocumented functions or rely on buggy behavior that happens to be buggy in Windows n but is no longer buggy in Windows n+1. In fact if you poke around in the AppCompatibility section of your registry you’ll see a whole list of applications that Windows treats specially, emulating various old bugs and quirky behaviors so they’ll continue to work. Raymond Chen writes, “I get particularly furious when people accuse Microsoft of maliciously breaking applications during OS upgrades. If any application failed to run on Windows 95, I took it as a personal failure. I spent many sleepless nights fixing bugs in third-party programs just so they could keep running on Windows 95.”
A lot of developers and engineers don’t agree with this way of working. If the application did something bad, or relied on some undocumented behavior, they think, it should just break when the OS gets upgraded. The developers of the Macintosh OS at Apple have always been in this camp. It’s why so few applications from the early days of the Macintosh still work. For example, a lot of developers used to try to make their Macintosh applications run faster by copying pointers out of the jump table and calling them directly instead of using the interrupt feature of the processor like they were supposed to. Even though somewhere in Inside Macintosh, Apple’s official Bible of Macintosh programming, there was a tech note saying “you can’t do this,” they did it, and it worked, and their programs ran faster… until the next version of the OS came out and they didn’t run at all. If the company that made the application went out of business (and most of them did), well, tough luck, bubby.
To contrast, I’ve got DOS applications that I wrote in 1983 for the very original IBM PC that still run flawlessly, thanks to the Raymond Chen Camp at Microsoft. I know, it’s not just Raymond, of course: it’s the whole modus operandi of the core Windows API team. But Raymond has publicized it the most through his excellent website The Old New Thing so I’ll name it after him.
That’s one camp. The other camp is what I’m going to call the MSDN Magazine camp, which I will name after the developer’s magazine full of exciting articles about all the different ways you can shoot yourself in the foot by using esoteric combinations of Microsoft products in your own software. The MSDN Magazine Camp is always trying to convince you to use new and complicated external technology like COM+, MSMQ, MSDE, Microsoft Office, Internet Explorer and its components, MSXML, DirectX (the very latest version, please), Windows Media Player, and Sharepoint… Sharepoint! which nobody has; a veritable panoply of external dependencies each one of which is going to be a huge headache when you ship your application to a paying customer and it doesn’t work right. The technical name for this is DLL Hell. It works here: why doesn’t it work there?
The Raymond Chen Camp believes in making things easy for developers by making it easy to write once and run anywhere (well, on any Windows box). The MSDN Magazine Camp believes in making things easy for developers by giving them really powerful chunks of code which they can leverage, if they are willing to pay the price of incredibly complicated deployment and installation headaches, not to mention the huge learning curve. The Raymond Chen camp is all about consolidation. Please, don’t make things any worse, let’s just keep making what we already have still work. The MSDN Magazine Camp needs to keep churning out new gigantic pieces of technology that nobody can keep up with.
Here’s why this matters.

Microsoft Lost the Backwards Compatibility Religion

Inside Microsoft, the MSDN Magazine Camp has won the battle.
The first big win was making Visual Basic.NET not backwards-compatible with VB 6.0. This was literally the first time in living memory that when you bought an upgrade to a Microsoft product, your old data (i.e. the code you had written in VB6) could not be imported perfectly and silently. It was the first time a Microsoft upgrade did not respect the work that users did using the previous version of a product.
And the sky didn’t seem to fall, not inside Microsoft. VB6 developers were up in arms, but they were disappearing anyway, because most of them were corporate developers who were migrating to web development anyway. The real long term damage was hidden.
With this major victory under their belts, the MSDN Magazine Camp took over. Suddenly it was OK to change things. IIS 6.0 came out with a different threading model that broke some old applications. I was shocked to discover that our customers with Windows Server 2003 were having trouble running FogBugz. Then .NET 1.1 was not perfectly backwards compatible with 1.0. And now that the cat was out of the bag, the OS team got into the spirit and decided that instead of adding features to the Windows API, they were going to completely replace it. Instead of Win32, we are told, we should now start getting ready for WinFX: the next generation Windows API. All different. Based on .NET with managed code. XAML. Avalon. Yes, vastly superior to Win32, I admit it. But not an upgrade: a break with the past.
Outside developers, who were never particularly happy with the complexity of Windows development, have defected from the Microsoft platform en-masse and are now developing for the web. Paul Graham, who created Yahoo! Stores in the early days of the dotcom boom, summarized it eloquently: “There is all the more reason for startups to write Web-based software now, because writing desktop software has become a lot less fun. If you want to write desktop software now you do it on Microsoft’s terms, calling their APIs and working around their buggy OS. And if you manage to write something that takes off, you may find that you were merely doing market research for Microsoft.”
Microsoft got big enough, with too many developers, and they were too addicted to upgrade revenues, so they suddenly decided that reinventing everything was not too big a project. Heck, we can do it twice. The old Microsoft, the Microsoft of Raymond Chen, might have implemented things like Avalon, the new graphics system, as a series of DLLs that can run on any version of Windows and which could be bundled with applications that need them. There’s no technical reason not to do this. But Microsoft needs to give you a reason to buy Longhorn, and what they’re trying to pull off is a sea change, similar to the sea change that occurred when Windows replaced DOS. The trouble is that Longhorn is not a very big advance over Windows XP; not nearly as big as Windows was over DOS. It probably won’t be compelling enough to get people to buy all new computers and applications like they did for Windows. Well, maybe it will, Microsoft certainly needs it to be, but what I’ve seen so far is not very convincing. A lot of the bets Microsoft made are the wrong ones. For example, WinFS, advertised as a way to make searching work by making the file system be a relational database, ignores the fact that the real way to make searching work is by making searching work. Don’t make me type metadata for all my files that I can search using a query language. Just do me a favor and search the damned hard drive, quickly, for the string I typed, using full-text indexes and other technologies that were boring in 1973.

Automatic Transmissions Win the Day

Don’t get me wrong… I think .NET is a great development environment and Avalon with XAML is a tremendous advance over the old way of writing GUI apps for Windows. The biggest advantage of .NET is the fact that it has automatic memory management.
A lot of us thought in the 1990s that the big battle would be between procedural and object oriented programming, and we thought that object oriented programming would provide a big boost in programmer productivity. I thought that, too. Some people still think that. It turns out we were wrong. Object oriented programming is handy dandy, but it’s not really the productivity booster that was promised. The real significant productivity advance we’ve had in programming has been from languages which manage memory for you automatically. It can be with reference counting or garbage collection; it can be Java, Lisp, Visual Basic (even 1.0), Smalltalk, or any of a number of scripting languages. If your programming language allows you to grab a chunk of memory without thinking about how it’s going to be released when you’re done with it, you’re using a managed-memory language, and you are going to be much more efficient than someone using a language in which you have to explicitly manage memory. Whenever you hear someone bragging about how productive their language is, they’re probably getting most of that productivity from the automated memory management, even if they misattribute it.
Sidebar
Why does automatic memory management make you so much more productive? 1) Because you can write f(g(x)) without worrying about how to free the return value from g, which means you can use functions which return interesting complex data types and functions which transform interesting complex data types, in turn allowing you to work at a higher level of abstraction. 2) Because you don’t have to spend any time writing code to free memory or tracking down memory leaks. 3) Because you don’t have to carefully coordinate the exit points from your functions to make sure things are cleaned up properly.
Racing car aficionados will probably send me hate mail for this, but my experience has been that there is only one case, in normal driving, where a good automatic transmission is inferior to a manual transmission. Similarly in software development: in almost every case, automatic memory management is superior to manual memory management and results in far greater programmer productivity.
If you were developing desktop applications in the early years of Windows, Microsoft offered you two ways to do it: writing C code which calls the Windows API directly and managing your own memory, or using Visual Basic and getting your memory managed for you. These are the two development environments I have used the most, personally, over the last 13 years or so, and I know them inside-out, and my experience has been that Visual Basic is significantly more productive. Often I’ve written the same code, once in C++ calling the Windows API and once in Visual Basic, and C++ always took three or four times as much work. Why? Memory management. The easiest way to see why is to look at the documentation for any Windows API function that needs to return a string. Look closely at how much discussion there is around the concept of who allocates the memory for the string, and how you negotiate how much memory will be needed. Typically, you have to call the function twice—on the first call, you tell it that you’ve allocated zero bytes, and it fails with a “not enough memory allocated” message and conveniently also tells you how much memory you need to allocate. That’s if you’re lucky enough not to be calling a function which returns a list of strings or a whole variable-length structure. In any case, simple operations like opening a file, writing a string, and closing it using the raw Windows API can take a page of code. In Visual Basic similar operations can take three lines.
So, you’ve got these two programming worlds. Everyone has pretty much decided that the world of managed code is far superior to the world of unmanaged code. Visual Basic was (and probably remains) the number one bestselling language product of all time and developers preferred it over C or C++ for Windows development, although the fact that “Basic” was in the name of the product made hardcore programmers shun it even though it was a fairly modern language with a handful of object-oriented features and very little leftover gunk (line numbers and the LET statement having gone the way of the hula hoop). The other problem with VB was that deployment required shipping a VB runtime, which was a big deal for shareware distributed over modems, and, worse, let other programmers see that your application was developed in (the shame!) Visual Basic.

One Runtime To Rule Them All

And along came .NET. This was a grand project, the super-duper unifying project to clean up the whole mess once and for all. It would have memory management, of course. It would still have Visual Basic, but it would gain a new language, one which is in spirit virtually the same as Visual Basic but with the C-like syntax of curly braces and semicolons. And best of all, the new Visual Basic/C hybrid would be called Visual C#, so you would not have to tell anyone you were a “Basic” programmer any more. All those horrid Windows functions with their tails and hooks and backwards-compatibility bugs and impossible-to-figure-out string-returning semantics would be wiped out, replaced by a single clean object oriented interface that only has one kind of string. One runtime to rule them all. It was beautiful. And they pulled it off, technically. .NET is a great programming environment that manages your memory and has a rich, complete, and consistent interface to the operating system and a rich, super complete, and elegant object library for basic operations.
And yet, people aren’t really using .NET much.
Oh sure, some of them are.
But the idea of unifying the mess of Visual Basic and Windows API programming by creating a completely new, ground-up programming environment with not one, not two, but three languages (or are there four?) is sort of like the idea of getting two quarreling kids to stop arguing by shouting “shut up!” louder than either of them. It only works on TV. In real life when you shout “shut up!” to two people arguing loudly you just create a louder three-way argument.
(By the way, for those of you who follow the arcane but politically-charged world of blog syndication feed formats, you can see the same thing happening over there. RSS became fragmented with several different versions, inaccurate specs and lots of political fighting, and the attempt to clean everything up by creating yet another format called Atom has resulted in several different versions of RSS plus one version of Atom, inaccurate specs and lots of political fighting. When you try to unify two opposing forces by creating a third alternative, you just end up with three opposing forces. You haven’t unified anything and you haven’t really fixed anything.)
So now instead of .NET unifying and simplifying, we have a big 6-way mess, with everybody trying to figure out which development strategy to use and whether they can afford to port their existing applications to .NET.
No matter how consistent Microsoft is in their marketing message (“just use .NET—trust us!”), most of their customers are still using C, C++, Visual Basic 6.0, and classic ASP, not to mention all the other development tools from other companies. And the ones that are using .NET are using ASP.NET to develop web applications, which run on a Windows server but don’t require Windows clients, which is a key point I’ll talk about more when I talk about the web.

Oh, Wait, There’s More Coming!

Now Microsoft has so many developers cranking away that it’s not enough to reinvent the entire Windows API: they have to reinvent it twice. At last year’s PDC they preannounced the next major version of their operating system, codenamed Longhorn, which will contain, among other things, a completely new user interface API, codenamed Avalon, rebuilt from the ground up to take advantage of modern computers’ fast display adapters and realtime 3D rendering. And if you’re developing a Windows GUI app today using Microsoft’s “official” latest-and-greatest Windows programming environment, WinForms, you’re going to have to start over again in two years to support Longhorn and Avalon. Which explains why WinForms is completely stillborn. Hope you haven’t invested too much in it. Jon Udell found a slide from Microsoft labelled “How Do I Pick Between Windows Forms and Avalon?” and asks, “Why do I have to pick between Windows Forms and Avalon?” A good question, and one to which he finds no great answer.
So you’ve got the Windows API, you’ve got VB, and now you’ve got .NET, in several language flavors, and don’t get too attached to any of that, because we’re making Avalon, you see, which will only run on the newest Microsoft operating system, which nobody will have for a loooong time. And personally I still haven’t had time to learn .NET very deeply, and we haven’t ported Fog Creek’s two applications from classic ASP and Visual Basic 6.0 to .NET because there’s no return on investment for us. None. It’s just Fire and Motion as far as I’m concerned: Microsoft would love for me to stop adding new features to our bug tracking software and content management software and instead waste a few months porting it to another programming environment, something which will not benefit a single customer and therefore will not gain us one additional sale, and therefore which is a complete waste of several months, which is great for Microsoft, because they have content management software and bug tracking software, too, so they’d like nothing better than for me to waste time spinning cycles catching up with the flavor du jour, and then waste another year or two doing an Avalon version, too, while they add features to their own competitive software. Riiiight.
No developer with a day job has time to keep up with all the new development tools coming out of Redmond, if only because there are too many dang employees at Microsoft making development tools!

It’s Not 1990

Microsoft grew up during the 1980s and 1990s, when the growth in personal computers was so dramatic that every year there were more new computers sold than the entire installed base. That meant that if you made a product that only worked on new computers, within a year or two it could take over the world even if nobody switched to your product. That was one of the reasons Word and Excel displaced WordPerfect and Lotus so thoroughly: Microsoft just waited for the next big wave of hardware upgrades and sold Windows, Word and Excel to corporations buying their next round of desktop computers (in some cases their first round). So in many ways Microsoft never needed to learn how to get an installed base to switch from product N to product N+1. When people get new computers, they’re happy to get all the latest Microsoft stuff on the new computer, but they’re far less likely to upgrade. This didn’t matter when the PC industry was growing like wildfire, but now that the world is saturated with PCs most of which are Just Fine, Thank You, Microsoft is suddenly realizing that it takes much longer for the latest thing to get out there. When they tried to “End Of Life” Windows 98, it turned out there were still so many people using it they had to promise to support that old creaking grandma for a few more years.
Unfortunately, these Brave New Strategies, things like .NET and Longhorn and Avalon, trying to create a new API to lock people into, can’t work very well if everybody is still using their good-enough computers from 1998. Even if Longhorn ships when it’s supposed to, in 2006, which I don’t believe for a minute, it will take a couple of years before enough people have it that it’s even worth considering as a development platform. Developers, developers, developers, and developers are not buying into Microsoft’s multiple-personality-disordered suggestions for how we should develop software.

Enter the Web

I’m not sure how I managed to get this far without mentioning the Web. Every developer has a choice to make when they plan a new software application: they can build it for the web or they can build a “rich client” application that runs on PCs. The basic pros and cons are simple: Web applications are easier to deploy, while rich clients offer faster response time enabling much more interesting user interfaces.
Web Applications are easier to deploy because there’s no installation involved. Installing a web application means typing a URL in the address bar. Today I installed Google’s new email application by typing Alt+D, gmail, Ctrl+Enter. There are far fewer compatibility problems and problems coexisting with other software. Every user of your product is using the same version so you never have to support a mix of old versions. You can use any programming environment you want because you only have to get it up and running on your own server. Your application is automatically available at virtually every reasonable computer on the planet. Your customers’ data, too, is automatically available at virtually every reasonable computer on the planet.
But there’s a price to pay in the smoothness of the user interface. Here are a few examples of things you can’t really do well in a web application:
  1. Create a fast drawing program
  2. Build a real-time spell checker with wavy red underlines
  3. Warn users that they are going to lose their work if they hit the close box of the browser
  4. Update a small part of the display based on a change that the user makes without a full roundtrip to the server
  5. Create a fast keyboard-driven interface that doesn’t require the mouse
  6. Let people continue working when they are not connected to the Internet
These are not all big issues. Some of them will be solved very soon by witty Javascript developers. Two new web applications, Gmail and Oddpost, both email apps, do a really decent job of working around or completely solving some of these issues. And users don’t seem to care about the little UI glitches and slowness of web interfaces. Almost all the normal people I know are perfectly happy with web-based email, for some reason, no matter how much I try to convince them that the rich client is, uh, richer.
So the Web user interface is about 80% there, and even without new web browsers we can probably get 95% there. This is Good Enough for most people and it’s certainly good enough for developers, who have voted to develop almost every significant new application as a web application.
Which means, suddenly, Microsoft’s API doesn’t matter so much. Web applications don’t require Windows.
It’s not that Microsoft didn’t notice this was happening. Of course they did, and when the implications became clear, they slammed on the brakes. Promising new technologies like HTAs and DHTML were stopped in their tracks. The Internet Explorer team seems to have disappeared; they have been completely missing in action for several years. There’s no way Microsoft is going to allow DHTML to get any better than it already is: it’s just too dangerous to their core business, the rich client. The big meme at Microsoft these days is: “Microsoft is betting the company on the rich client.” You’ll see that somewhere in every slide presentation about Longhorn. Joe Beda, from the Avalon team, says that “Avalon, and Longhorn in general, is Microsoft’s stake in the ground, saying that we believe power on your desktop, locally sitting there doing cool stuff, is here to stay. We’re investing on the desktop, we think it’s a good place to be, and we hope we’re going to start a wave of excitement…”
The trouble is: it’s too late.

I’m a Little Bit Sad About This, Myself

I’m actually a little bit sad about this, myself. To me the Web is great but Web-based applications with their sucky, high-latency, inconsistent user interfaces are a huge step backwards in daily usability. I love my rich client applications and would go nuts if I had to use web versions of the applications I use daily: Visual Studio, CityDesk, Outlook, Corel PhotoPaint, QuickBooks. But that’s what developers are going to give us. Nobody (by which, again, I mean “fewer than 10,000,000 people”) wants to develop for the Windows API any more. Venture Capitalists won’t invest in Windows applications because they’re so afraid of competition from Microsoft. And most users don’t seem to care about crappy Web UIs as much as I do.
And here’s the clincher: I noticed (and confirmed this with a recruiter friend) that Windows API programmers here in New York City who know C++ and COM programming earn about $130,000 a year, while typical Web programmers using managed code languages (Java, PHP, Perl, even ASP.NET) earn about $80,000 a year. That’s a huge difference, and when I talked to some friends from Microsoft Consulting Services about this they admitted that Microsoft had lost a whole generation of developers. The reason it takes $130,000 to hire someone with COM experience is because nobody bothered learning COM programming in the last eight years or so, so you have to find somebody really senior, usually they’re already in management, and convince them to take a job as a grunt programmer, dealing with (God help me) marshalling and monikers and apartment threading and aggregates and tearoffs and a million other things that, basically, only Don Box ever understood, and even Don Box can’t bear to look at them any more.
Much as I hate to say it, a huge chunk of developers have long since moved to the web and refuse to move back. Most .NET developers are ASP.NET developers, developing for Microsoft’s web server. ASP.NET is brilliant; I’ve been working with web development for ten years and it’s really just a generation ahead of everything out there. But it’s a server technology, so clients can use any kind of desktop they want. And it runs pretty well under Linux using Mono.
None of this bodes well for Microsoft and the profits it enjoyed thanks to its API power. The new API is HTML, and the new winners in the application development marketplace will be the people who can make HTML sing.