Hiển thị các bài đăng có nhãn Learning styles. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Learning styles. Hiển thị tất cả bài đăng
This article discusses the habits which would need to be avoided if a person wants to become a good programmer.

Introduction and background



The information technology is not a new term now. For a common person, this is the field which guarantees good money and life (in the context of INDIA). People working in this industry are looked up-to and generally considered intelligent than others. 
After working for quite some time in this industry, looks like the above points are coming very close to being a myth.
Definitely this industry has been life changer for many and also big employer, foreign currency grabber but by large it would be interesting to know what’s the reality at ground level.
Many would comment that the quote about intelligence is overrated and this is just another industry with revenues in dollars helping for mammoth turnovers.
The common minimum ingredient of this industry is a programmer (or a developer or coder) who is the one writing the programs which are supposed to make things happen. As in every field of life, there are good programmer and bad programmers. The other hot topic in this industry is whether this industry possesses chunk of good programmer or not. Many wouldn’t agree.
So, what makes a good programmer? This is debatable point and to make things simpler, let’s see this the other way round i.e. discuss the top 10 enemies which can prevent oneself from becoming a good programmer.

Objective


To know about the DONT's if anyone wants to become a good programmer.

Description

Programming world is a confusing world. There have been so many languages, technologies, platforms, infrastructures to choose from which doesn't make life of a programmer easy even though they are supposed to. In the scenario where business needs are outscoring the engineering practices, the programming has become a real complex thing increasingly challenged by time and budget. There has been lot of research into software metric to measure the performance and quality but it still not straightforward to categorize programmers and probably say who is good or bad. Following are list of points which if we can ensure while programming, would definitely result in better code quality, better planning and better professional life. These points are picked up from real incidences which always keep happening with considerable frequency and it is observed that such incidences leads to poor quality, performance and higher costs. These points are not just related to technical skill but rather the attitude, awareness, behavior.

1. Is it computer or my program: When something goes wrong there is a tendency to term that it must be something wrong with computers or something else other than me? It’s funny but it omnipresent statement one hears. Barring few cases, it’s always the program doing something wrong rather than computer. If we take environmental, infrastructural attributes into account while programming we won't end of saying this. This is the biggest enemy.
2. Its working on my PC: This is probably mostly used age old statement and many have encountered it umpteen times. It is hard to believe but it happens all the time that the programs work well on developer’s machine but fail after deployment... Do we program for our own pc or our programs are intended to run only on the developer’s machine? Surely not and this is caused by insufficient programming skills and not enough knowledge of working environments, necessary settings etc.
In most of such cases, mostly the programmer has forgotten to update the deployed environment with some settings/ configurations, some component missing etc. rather than anything else.
3. Finger pointing: I have just changed it but I didn’t cause this error, it must be somebody else who might have worked on the same stuff. This is a statement one would hear all the time and it’s generally the first reaction one would hear when asked about some error or fault. In reality, something is changed and the original functionality is also lost then these statements are made. This is quite intriguing that something is changed and before a change things were working and still the programmers say this. This depicts the lack of ownership as well as understanding and escapist attitude. Given the complexity and difficulty to find the facts, many are encourage saying this.
There is a small remedy to overcome this and which is the practice of performing unit testing and take my word, life would be easy.
4. Skipping the validation of user input: While programming for user interactive applications / programs, one tends to skip the validation of user inputs under the assumption that he has coded for it and it shall work. The minimum check which is like confirming the data entered in GUI doesn’t exceed the data type and lengths defined in the database. No wonder, many of the defects and also the program crashes arises out of lack of such validation.
It is better to always ensure that the data types and lengths on GUI matches with the ones defined in data source and also it handles the common pitfalls which can spell doom for hackers. 
5. Not estimating (or planning) the work or tasks: Most of the programmer (especially junior ones) has urged to jump into coding without estimating the work. Estimation is just not important from planning perspective but it gives an opportunity to revisit the scope as the estimates are bound to scope.
There might couple of tasks challenged by time and/or budget which can be performed well without estimates but not     all. Whatever may the work or tasks if it is estimated, then it ease out planning, controlling and monitoring and also         given an avenue for asking the help before it is too late?
6.   Swallowing the exceptions: Exception handling is still a mystery for many programmers and when he/ she don’t know how to handle the exception or there is lack of good exception handling mechanism, the exceptions are swallowed means not action is taken after the occurrence of such exceptions or errors.
     Today's programming languages offers far more sophisticated mechanism in the form of try-catch-finally. This           swallowing mostly results into application crashes putting programmers into awkward position.
7.   Blindly copying and pasting: In today’s internet era, everything is available on internet and code snippets are not exceptions to this. With super-efficient searches, it is possible to locate code snippet which can do one's job.     
Probably it can't be called wrong to copy such code snippets and use but unfortunately the usage is always coincided      by blindly copying or retrofitting which results into partial solutions not taking into account the existing scenario. Also      one has to remember that such code snippets needs more rigorous testing than your native code to make sure that it      is doing what is needed. Another example is copying from code samples or others code which generally skips the            understanding curve resulting into inferior quality software and it is also difficult to change such program and                  maintain too. So copying and pasting is unavoidable but it would be better to invest some time to understand what it      is doing and what is expected to be done and perform this with sound judgment.
8. Not being latest: The technology paradigm is characterized by the continuous changes and improvements. While working hard and long, many programmers are not able to synch them up with such changes and improvements. This may result in inferior solutions or far more time investment than could be justified. Also there are many changes happening on software engineering front where new methodologies like Agile, XP are introduced which can address many pertinent challenges in development life cycle.

9.  Lack of Documentation/ comments/standardization: No denying the fact the programs are written to be executed by computers but they are also written which could be understood by others. Many programmers shy away from writing enough comments or documentation which can help others about why, how and when something is done. Essentially this makes other programmer not attempting to understand and write something which would add to confusion. There are many instances of coding horrors, coding mess, coding chaos which have one thing in common and i.e. lack of documentation and standardization. Essentially the programs shall be human readable.

10. Speed well than accuracy:This is a trap for even the proven programmers. Many programmers think that the programming is 100 ctr races and one has to be lightning fast to win this race and in the process the quality, accuracy is sacrificed. This catapults into more work (many would want this for continuity of their business) which is not good of one looks at cost and time. Accuracy could attain more priority and speed with accuracy could be the motto. 

Summary and Conclusion

This topic is exhaustive and complex to discussed and addressed on one write-up. Still these 10 point are put forth to touch base the perennial challenges in software industry. There may be more apt points and detailed discussions but hope that this write-up could help to bring some really interesting practices to the fore.

10 enemies of being a good programmer

Đây là 1 comment của bạn Hoàng Minh Triết. Bạn ấy đề nghị tôi đưa lên thành 1 bài viết. Nhận thấy đây cũng là 1 chia sẻ rất hay nên tôi tôi quyết định đưa lên để mọi người cùng chia sẻ ý kiến của mình.

Cám ơn bạn Triết rất nhiều!

Lựa chọn ngành CNTT: Tôi đã đi lầm đường hay có quá nhiều quyết định sai trái?

1/ Bước vào cổng đại học

Cách đây 5 năm, sau khi tốt nghiệp PT tại 1 trường thuộc hàng top tại tp.hcm, tôi quyết định chọn thi vào ngành CNTT, và xác định trước hướng theo học là công nghệ phần mềm.

Theo lời khuyên của ba tôi, tôi cũng vào học tại 1 trung tâm đào tạo lập trình viên Aptech, để vừa có bằng đại học mà tiến thân, vừa có kỹ năng làm việc thực hành. Điều kiện của tôi thuận lợi hơn tất cả mọi người cùng trang lứa, và sức học của tôi cũng khá, dễ dàng vượt qua các bài thi. Thậm chí, đến giai đoạn chuyên ngành điểm các môn chuyên ngành có thấp lắm cũng chỉ dừng ở 7, và phổ biến ở mức 9,10.

2/ Có nên đi làm trong lúc còn đi học?

Lúc đó là vào khoảng đầu năm 3 đại học, tháng 11 năm đó, tôi cũng vừa tốt nghiệp xong chương trình LTV Aptech, và cũng hào hứng háo hức đi làm. Chỉ sau 3 ngày post hồ sơ lên các trang mạng tuyển dụng, có hơn 4 ,5 công ty gì đó mời cộng tác.

Tôi hớn hở về nhà khoe với ba mẹ, thì được ba mẹ phán cho mấy câu xanh rờn “Nhà mình đâu có thiếu thốn gì mà phải đi làm. Ba còn đi làm, kiếm ra tiền, con muốn học gì thì học, ba mẹ không có tiếc tiền với chuyện học của các con. Chuyện gì chứ chuyện học thì không bao giờ từ chối chi tiền. Giờ cứ lo học cho xong cái bằng đại học đã, rồi muốn đi làm gì thì làm.”. Khi đó tôi có vẻ xìu xuống, nhiệt huyết đi làm giảm dần nhưng vẫn chưa từ bỏ ý định.

Vài hôm sau lên văn phòng khoa xin cái bảng điểm thì gặp cô phó khoa cũng phán cho 1 câu xanh rờn từa tựa như vậy: “Mấy em cứ học xong hết đi rồi hãy đi làm, đừng có gấp, đừng có ham đi làm.”. Thời gian đó cũng sắp thi học kỳ, cộng với bao nhiêu lời khuyên của những ng xung quanh, ý định ban đầu không còn chắc chắn nữa, lung lay dần đi.

Tôi quyết định nghe theo mọi người, cũng vì câu mà mẹ tôi hay nói: “biết nghe lời đi, đứa nào cãi tao thì chỉ có chết tới bị thương”, và mỗi khi tôi thất bại thì mẹ hay lôi câu đó ra mà phán. Nghe cũng có vẻ hợp với cái lẽ: “cá không ăn muối cá ươn…”. Thế là tôi từ bỏ hẳn ý định đi làm từ sớm, mặc dù rất muốn.

3/ Ra trường

2 năm sau đó, sau khi hoàn tất chương trình đại học, và vượt qua 1 cái luận văn mà nội dung cũng thuộc hàng xương xẩu để lấy 1 điểm số tốt, tôi chính thức tốt nghiệp đh sau đúng 5 năm học. Bảng điểm sạch sẽ, không nợ môn nào trước khi làm luận văn.

Có 1 dịp tình cờ gặp lại thằng bạn thân hồi cấp 3, cũng đã tốt nghiệp ĐH Khoa học tự nhiên. 2 đứa đi cafe karaoke cả buổi với mấy đứa ban nữa để tâm sự. Nó nói: tao thất nghiệp nửa năm nay. Lúc đó tôi cười thầm, không nói gì, cũng không nghĩ gì, vì tôi lạc quan , và có niềmtin vào khả năng của bản thân để bắt đầu 1 hành trình mới:

4/ Đi tìm việc làm.

Nhìn lại bộ hồ sơ tìm việc làm:
+ bằng cấp: đủ
+ bảng điểm: tốt
+ chứng chỉ quốc tế: luôn là 1 lợi thế
+ ngoại ngữ: cũng khá, có điều chỉ đọc được tài liệu chuyên môn chứ giao tiếp thì _@#(%&$*^.
Tôi bắt đầu apply vào những công ty thuộc hàng “ăn trên ngồi trước” trước. Khổ cái:
+ cty nước ngoài thì đòi tiếng Anh giao tiếp
+ các công ty lớn thì đòi kinh nghiệm 2,3 năm.

Tôi bắt đầu “hạ chuẩn” xuống: lương thấp hơn 1 tí, công ty bình dân hơn 1 tí, thì gặp phải đòi hỏi: 1 năm kinh nghiệm: he, cái này không thành vấn đề, nhưng nhìn lại vị trí, công việc, và công nghệ sử dụng, thì nó lại có vấn đề.

5/ Khó khăn nối tiếp khó khăn

Ở ĐH cũng như Aptech, tôi chỉ học về các công nghệ cao cấp như J2EE, .NET là chủ yếu, còn những món như PHP thì không quan tâm lắm. Qua 1 thời gian theo dõi, tôi thấy các cty bây giờ hay chuộng tuyển lt viên làm web, với PHP,MYSQL và 1 số CMS như Joomla, hay Framework Drupal, Template Smarty gì gì đó. Tôi chỉ có biết 1 ít về PHP, vì nó giống C,C++, MYSQL thì cũng có khác gì nhiều so với SQLSERVER đâu, nói chung những thứ lặt vặt về web tôi đều làm được cả, chỉ là chưa biết và chưa có kinh nghiệm với cácCMS,Framework trong lĩnh vực này.

Tuy nhiên 1 cái khó nữa là đã lập trình web, phải biết về nào là Flash, Photoshop,… cái này thì tôi mù tịt hoàn toàn. Tôi chỉ biết chờ đợi xem có công việc nào phù hợp hơn với mình hay không. Nhưng càng ngày cơ hội việc làm càng ít đi. Dạo qua các trang tuyển dụng thì thấy xu hướng tuyển dung như sau:

6/ Xu hướng tuyển dụng tại VN vao thời điểm tháng 6,7 / 2009:

+ Hà Nội: tuyển ltv nhiều, ít kn hoặc mới ra trường chưa đi làm cũng được – nhưng tôi ở HCM mà v
+ HCM: tuyển ltv ít, nhưng phải có kn làm việc 2,3 năm, chỗ nào bèo lắm thì cũng 1 năm + với 1 số thứ tôi không biết như nêu trên.
Ngoài ra, các cty pm tại HCM hiện thời điểm này lại có xu hướng
+ hạn chế tuyển ltv
+ mà tuyển hàng loạt tester
+ và nhân viên kinh doanh phần mềm.

Oax, trong đh chả có môn nào đào tạo về quy trình test, hay kỹ thuật test cả, có chăng môn CNPM thì nói 1 chút, mà cũng chỉ cưỡi ngựa xem hoa qua lý thuyết, hoàn toàn không chú trọng hay nhấn mạnh gì. Còn về vị trí NV kinh doanh pm thì tôi chả quan tâm, vì tôi học rất khá , và mong muốn làm đúng vị trí chuyên môn phù hợp với mình thôi.

Đảo qua đảo lại, tôi thấy nhu cầu tuyển dụng của các cty và khả năng của tôi càng ngày càng ít “khớp nhau”, “hạ chuẩn” chút nữa, tôi chuyển sang tìm các công ty tư nhân cần nhân viên IT. Đối với các cty tư nhân tuyển NV IT như thế này, thì họ chả yêu cầu ngoại ngữ cao, cũng chả yêu cầu lập trình quá giỏi, mà cái họ cần là: 1 NV IT đa năng:

+ lập trình web
+ kiêm webmaster
+ kiêm cài phần mềm
+ bảo trì máy tính
+ đi dây mạng
+ quản trị mạng
+ quản lý csdl, ….
…cái gì cũng làm, nhưng mà lương thấp chủn.

7/ Một thoáng lo âu

Ngày qua ngày cứ lặp lại, nhiều hôm buồn thức đến 3,4 h sáng để vào mấy trang tìm việc, dù biết giờ này còn ai tuyển nữa chứ, mà những tin đó thì trong ngày đã đọc rồi. Thậm chí có những hôm chiều thứ sáu, tôi tranh thủ đọc cho hết mấy cái tin tuyển dụng rao đầy trên mạng nhưng… chả ăn nhậu gì với thứ mình cần tìm, chỉ sợ mai thứ 7 cuối tuần thì không còn gì để đọc.

Ngó lại những thứ họ cần:
+ Nếu là tuyển sv mới tốt nghiệp, thì thường là cty nước ngoài, tuyển về đào tạo lại, và cần khả năng tiếng anh rất lưu loát
+ Nếu là lập trình quản lý với java, .net , thì cần nhiều năm kinh nghiệm
+ Nếu là lập trình web với php, thì cũng phải cần flash, photoshop, design…
+ Nếu có là NV IT quèn, cũng phải cần quản trị mạng, đi dây mạng, làm những thứ linh tinh như sửa máy, cài pm
+ 1 số cty nữa tuyển nv mới tn lương cũng rất khá, nhưng lại làm việc lập trình driver, hệ thống với C,C++ cái này lĩnh vực này bó tay
+ 1 số chỗ tuyển lập trình game, lập trình mobile: không biết tí gì, muốn làm cũng phải bỏ ra vài tháng học và nghiên cứu về mobile environment, graphics 2d,3d – món này không đơn giản , mà đến lúc đó nó hết chỗ rồi (#@&$(#, mà lĩnh vực này rất ít chỗ tuyển thì phải.

8/ Tôi bị mắc sai lầm ở cái công đoạn nào nhỉ?

-> đáng lẽ ra nên chú trọng học ngoại ngữ giao tiếp, hơn là ôm cái mớ kiến thức chuyên môn cày project hết ngày này qua ngày khác?
-> đáng lẽ nên học những thứ bình dân nhưng dễ tìm việc như PHP,MYSQL,Joomla,Flash,Photoshop, hơn là những cái của cao cấp như .NET, J2EE (muốn làm thì phải có kn nhiều năm, mà mới ra trường thì….)
-> không giữ vững lập trường : đáng lẽ nên đi làm từ năm thứ 3 khi có chỗ gọi, để đến bây giờ thì cũng đã có 2 , 3 năm gọi là kinh nghiệm rồi.

Bây giờ công việc hàng ngày của tôi là: học tiếng Anh, học photoshop, học flash, và chờ có chỗ nào nó mướn làm web mà không đòi hỏi đồ họa thẩm mỹ cao thì nhào vô xơi. _o. Thế đấy, học hành cho cố vào, rồi bây giờ thất nghiệp.

Cho đến tận hôm nay, vào mấy trang tuyển việc làm cũng còn quá hẻo, toàn tuyển NV IT , quản trị mạng, và thiết kế đồ họa, flash, actionscript gì đó. Lúc mới vào đh thì CNTT là 1 ngành hot, và cái công việc lập trình viên có vẻ hấp dẫn hơn những thứ này nhiều.

Giờ ra trường rồi, thì thời thế đổi thay. Người ta còn có chỗ dựa hơi, quen biết “này nọ” mà kiếm cái chỗ nương náu, còn đây thì (#&(@#% tự bươn chải. Mặc dù rất chán nản, nhiều hôm gục lên gục xuống nhưng vẫn kiên trì, với chút hy vọng nhỏ nhoi, biết đâu “qua cơn bĩ cực tới hồi thái lai”.

Vô tình đọc được
Còn đầy là ý kiến của thầy Huy, dạy PHP ở Việt Chuyên :
Riêng về quan điểm của tôi trong nghề nghiệp, theo tôi để nhanh tiến tới thành công thì các bạn nên học tích cực khi còn đang ngồi trên ghế nhà trường. Nếu các bạn chịu khó đầu tư tiếng anh và kỹ năng lập trình từ năm nhất thì khoảng cuối năm 2 có lẽ bạn đã khá cứng cáp với nền tảng xây dựng từ đầu. Khi đó bạn có thể đi nhận các dự án theo dạng part time để lấy kinh nghiệm. Đến năm thứ 4 khi bạn ra trường bạn đã có trong tay 4 năm nghiên cứu ngôn ngữ lập trình PHP và 2 năm kinh nghiệm thực tế. Cố gắng tốt nghiệp ĐH với tấm bằng trung bình – khá hoặc khá (đừng để trung bình). Vì như thế CV của bạn sẽ mất điểm trước nhà tuyển dụng.
Mới tốt nghiệp, nhiều bạn ào ào đi làm. Nhưng tôi nghĩ các bạn lúc này hãy dành thời gian khoảng 6 tháng để review và tập trung nghiên cứu kiến thức 1 cách bài bản. Khi đã vững, bạn đừng ngấn ngại nộp vào các công ty lớn để thử sức mình với áp lực công việc.
Dựa vào 4,5 năm làm việc với PHP, tôi tin rằng chẳng mấy chốc các bạn sẽ thăng tiến khá nhanh với nghề nghiệp của mình. Và luôn nhớ rằng đừng bao giờ chấp nhận với lượng kiến thức mình đang có, hãy không ngừng cập nhật, nghiên cứu để làm giàu vốn liếng của bạn. Khi đó cơ hội tự khắc sẽ đến và bạn 1 bước sẽ leo lên vị trí cao trong ngành nghề.
Các bạn cũng nên cẩn thận 1 điều. Làm công ty lớn thì cơ hội thăng tiến đúng là rất cao. Nhưng đổi lại tình người mỏng hơn giấy. Ít bạn bè, nhiều kẻ thù là 1 sự thật trong môi trường CNTT cạnh tranh hiện nay.
Chúc các bạn thành công và đạt được như mong đợi nhé !!!



ref : http://vovanhai.wordpress.com/2011/08/10/l%E1%BB%B1a-ch%E1%BB%8Dn-nganh-cntt-toi-da-di-l%E1%BA%A7m-d%C6%B0%E1%BB%9Dng-hay-co-qua-nhi%E1%BB%81u-quy%E1%BA%BFt-d%E1%BB%8Bnh-sai-trai/

Lựa chọn ngành CNTT: Tôi đã đi lầm đường hay có quá nhiều quyết định sai trái?

Lập trình là một công việc như thế nào? Có phải lập trình viên là những người tối ngày ngồi trước màn hình máy tính? Cứ code giỏi thì sản phẩm sẽ tốt?


Bạn hình dung lập trình viên là người luôn gắn chặt với chiếc máy tính, tay anh ta thì liên tục gõ và gõ các dòng lệnh khô khan, không ai hiểu?? Đấy chỉ là những hình ảnh thường thấy trên các bộ phim của Hollywood mà thôi. Vậy sự thật thì như nào? Chúng ta hãy cùng tham khảo những chia sẻ từ kĩ sư công nghệ thông tin David Veksler – chủ trang blog The Rational Mind về những sự thật ít ai biết về nghề IT – nghề lập trình.
Những quan niệm không đúng thực tế về dân lập tình - gõ và gõ code liên tục

- Chỉ 10-20% thời gian của toàn bộ dự án được các lập trình viên sử dụng để viết code, và bất kể trình độ, mỗi ngày 1 lập trình viên chỉ viết trung bình từ 10-20 dòng code. Sự khác biệt giữa tay chuyên và gà mờ đó là tay chuyên thì dành 90% thời gian để suy luận, tìm tòi và thử nghiệm các phương án tối ưu nhất cho mình; còn những gà mờ thì dành 90% thời gian để debug, thay đổi vài chỗ trong code, lại debug và mong đến một lúc nào đó chương trình sẽ hoạt động.'


- Một lập trình viên tốt cho năng suất gấp 10 một lập trình viên tầm tầm. Một lập trình viên giỏi có thể còn hơn nữa, 20 cho đến 100 lần tùy hoàn cảnh. Đây là một sự thật không hề “gió” và đã được khoa học chứng minh từ tận những năm 60. Còn một lập trình viên tồi thì chung quy hiệu suất bằng không – chẳng làm nên chuyện gì, ngược lại vẽ ra nhiều vấn đề rối tinh rối mù cho người khác phải bận tâm sửa hộ.

“Một công nhân có kĩ thuật tiện cao siêu có thể giá trị gấp vài lần một công nhân với kĩ thuật trung bình. Nhưng một lập trình viên giỏi thì có giá trị gấp 10,000 lần một lập trình viên với trình độ trung bình.” – Bill Gates


- Các lập trình viên giỏi thường không dành nhiều thời gian để code, trái lại những người code liên tục từ lúc này sang lúc khác lại là những người lười biếng, vô tâm, kiêu ngạo và ít chịu tìm tòi nhất. Người lập trình tốt là người biết vận dụng linh hoạt mọi giải pháp mình từng vận dụng qua cho mọi vấn đề họ gặp phải; người lập trình tồi là người viết nên những đoạn code dài dòng, rắc rối, bố cục lung tung và khó để chỉnh sửa. Thực ra quẳng hết mớ code hỏng ra ngoài và bắt đầu lại từ đầu lại là một lựa chọn hữu ích hơn ngồi ì ạch sửa từng chút một.


- Định luật entropy bao hàm mọi vật – entropy là một hàm biểu thị mức độ hỗn loạn của một sự kiện diễn ra trong vô số các khả năng ngẫu nhiên có thể diễn ra. Trong lập trình, thay đổi liên tục sẽ dẫn đến phá vỡ mô hình nguyên bản của thiết kế, dẫn đến sự suy giảm giá trị phần mềm (software rot). Dẫu biết điều này là không thể tránh khỏi, song các lập trình viên không nắm bắt được hình mẫu sơ khai của dự án và biết cách biến nó thành hiện thực sẽ tạo ra những phần mềm thất bại đến nỗi giá trị đã tiêu hao sạch sẽ kể cả trước khi dự án hoàn thành, và đây thường là lý do phổ biến nhất  tạo nên các phần mềm thất bại (Lí do phổ biến thứ nhì là tạo ra những giá trị mà khách hàng không cần đến).


Một lập trình viên giỏi sẽ dành nhiều thời gian để suy luận và tìm tòi.

- Trong năm 1994, 31% các dự án phần mềm sẽ thất bại “sặc gạch” từ đầu đến chân. Con số này đến năm 2004 thì đã được cải thiện, chỉ còn 15%, song 51% các dự án thì bị thất bại trên phương diện trí mạng của mình.


Mặc dù hầu hết các phần mềm đều được xây dựng bởi các đội ngũ chứ không riêng gì ai, nhưng đó cũng không phải là một hoạt động mang tính dân chủ. Thường thì chỉ có một người duy nhất chịu trách nhiệm về thiết kế, còn lại cả đội nghĩ cách lấp đầy cách khoảng trống xuất hiện. Kết cấu này giống với một tổ ong hay kiến nhiều hơn.


Lập trình là việc của những người chăm chỉ, trong đó, đặc biệt là bộ não sẽ phải hoạt động điên cuồng. Những lập trình viên tốt nghĩ về công việc của mình 24/7. Họ viết ra những dòng code tuyệt vời nhất trong bồn tắm hay những giấc mơ. Tại sao? Bởi hầu hết các công việc quan trọng đều không được hoàn thành tại chính nơi làm việc của nó, bản thân Einstein cũng đã tháo gỡ nút thắt trong thuyết tương đối của mình khi mơ. Làm phần mềm không phải đơn giản chỉ cần dành nhiều thời gian làm việc hay thêm người vào là có thể hoàn thành.

Theo : http://www.techz.vn  

Những điều chưa tiết lộ về công việc của một lập trình viên

About a year ago, I wrote out some principles for web programming in PHP. I called it the MicroPHP Manifesto. The thing is, what I talked about wasn’t really specific to PHP. So, I’ve decided to explore the concepts again in the context of the other languages I work with.

What follows are some principles I try to keep in mind.

Learn languages, not frameworks


I like PHP, Python, and JavaScript, and I like making things in PHP, Python, and JavaScript. I’m not a Symfony developer, or a Django developer, or a jQuery developer.

I think this is an important distinction. It’s entirely possible to be a jQuery developer, but not a JavaScript developer. It’s possible to be a Django developer, but not a Python developer. Those are all certainly valuable and useful tools, but if I only know how to use one framework, my options for using the right tool for the job get pretty limited, and in my experience, large, full-stack frameworks are often not the right tool, particularly if flexibilty and performance are major concerns.

My experience has been that I become a better, more versatile developer when I focus on learning a language first. Diving head-first into a full-stack, complex framework when I’m starting out has allowed me to build finished products more quickly, but it also becomes a detriment when I need solutions outside of the framework’s scope. I often end up with a “plug and pray” approach to development, where I find a library or plugin that sounds like it will meet my needs, cross my fingers, and shove it in. That might get my app launched faster, but it makes stuff a lot harder down the road.

Additionally, learning a full-stack framework can be as complex as learning a new programming language. They often have complex architectures and nomenclatures — parts that don’t carry over to other frameworks and tools. I’d rather spend my time learning more about the language itself, knowing the skills that I learn will apply to anything I build in the language, no matter which libraries I use.

Build small things


Small units of code are good. The smaller it is, the easier it is to understand. It’s harder to screw it up — and I screw stuff up a lot, so limiting that is really important.

So, I strive to build small modules of code with a single purpose, or at most a few closely-related purposes. They should be self-contained pieces that solve individual problems. These pieces then work together to solve larger, more complex problems.

With simpler, modular code, fixing bugs is easier, because I can look at an individual piece and see clearly what it’s doing. And, if the modules are self-contained, testing my code is much easier.

Less code is better than more


To paraphrase Biggie Smalls, “more code, more problems.”

I want to manage less code. Larger codebases get harder to manage. Searching across the codebase takes longer. Navigating through complex file structures takes longer. Tracing execution through dozens of files is hard. Keeping it all straight in my brain gets challenging.

Bigger libraries and longer code seem to overflow my brain buffer. I have trouble keeping track of code flow when the source gets too long, or when execution is jumping between several source files, and visual noise really affects me, too. This is why I love syntax coloring so much, and consistent whitespace really helps. I use the code folding feature in my editor a lot, just to hide things, so I can focus better on the task at hand.
I also want to support less code. I’m responsible for all of the code that my app uses, not just the stuff I wrote — every single line of it. This means that bugs and security holes are my responsibility. How often do we see a WordPress or Drupal plugin get abandoned after a year or so? Am I sure I want to use a piece of code I don’t really understand, when a year down the road I may have to fix an exploit in it?

This is not to say that I would never use code that I didn’t write — I’d be hard-pressed to get much done that way, and frankly there are better programmers out there than me — but every line of code in my app matters, so I need to justify each one.

Create and use simple, readable code


I want code that is easy to understand. Understanding things quickly means getting stuff done faster. My time to productivity is shortened. My time to fix bugs is shortened.

I also want code that is easy to verify. My code should be testable, whether or not I get around to actually writing those tests, and I’ve consistently found that simpler, more modular code is more testable.

Readability should be a feature. Code should be simple and terse, but clear. Value clarity over cleverness. When I’m writing code, I try to consider how quickly another developer will be able to understand it at first glance. Alternately, will I be able to understand it when I come back to it in two months? The less time I waste trying to figure out how things work, the more there will be for getting things done.

I’d be lying if I said I always follow these principles. Sometimes, I just get lazy. Sometimes, time constraints mean I write hacky, complex code as fast as possible to get something working, or I pull in a library without reviewing it carefully, and hope it works. In the short term, writing simple, clear code is harder — it requires more discipline and frequent reassessment of technique. Particularly with time-sensitive projects, it’s hard to ever feel like I ever am entirely happy with the results.

But, when I make the time and put the effort in, it always pays off down the road — not just for myself, but for the other members of my team and people who use the code I’ve written, and that’s a really good feeling.


More Code, More Problems

On a rainy morning I found myself sitting on the desk thinking about efficient working. Before I started as a freelancer I had some days were I worked lots but could look only back on a worse outcome.

I started with Zen practice back in 2006. What clearly came to my mind before a good while was: the old Zenmasters already knew before hundreds of years, how today programmers should work. Even when I don’t like these “be a better programmer” posts, I want to outline some of my thoughts from that morning. It shall serve me as a reminder, but if you have some ideas about it, feel free to comment.

1. Focus

If you have decided to work on a task, do it as well as you can. Don’t start multiple things at the same time. Do only one thing at one time. You’ll not become quicker, just you work multi-threaded. If you work multi-threaded you’ll become exhausted, make more errors and lose time to jump from one task to another. This is not only about programming, this is a general tip.

Kodo Sawaki says: if you need to sleep, sleep. Don’t plan your software when you try to sleep. Just sleep. If you code, code. Don’t dream away – code. If you are so tired that you cannot program, sleep. Even known multitaskers like Stephan Uhrenbacher meanwhile have decided to work singlethreaded. I have made a similar experience to Stephan and finally I wrote Time & Bill, a time tracking tool. Goal was to track my time so easily that I even do it for small tasks like a phone call. Now I can create a few stopwatches at the beginning of the day and track my time with only one click. The outcome was a disaster: sometimes I just worked a few minutes on a task until I moved on to the next one. Now I am better. Similar to the Pomodoro technique I plan a few time slots and concentrate on them. No chatting, no sleeping, no checking out of a new great game on the Appstore.




2. Keep your mind clean

Before you work on your software, you need to clean up your memory. Throw away everything in your mind for the time being. If you have trouble with something, don’t let it influence you. It is mostly the case that trouble will go away. If the trouble is so heavy that you can’t let it go, don’t work. Try to clear things up. But when you start working, let the outer world shape away.

Something exciting on the mailing list? Leave it there. You can follow the exciting stuff again – later. Shutdown what fills your mind with shit: close Twitter, Facebook, your E-Mails. You should even mute the ringing of you mobile and leave it in your pocket. You can say it is similar to item #1, focus. But there is one more restriction: don’t use that tools before work or at lunch. They connect you with the outer world and probably bring up some new trouble or things which require you attention.

Think like this: at most times your mind is pretty clean when you wake up at the morning. If it is not, some sports helps (I do long distance running). If you feel clean and refreshed, go to work and work as well as you can. When you leave your work then you can fill up your mind with clutter. You’ll see it is not so much fun if you have a full working day behind you. Twitter and Co are consuming much of your energy. Do not think: it is just a minute. It is not.

You know it already.

3. Beginners mind.

Remember the days were you were a beginner. Or memorize, if you still are one. You have never learned enough. Think of yourself as you were a beginner, every day. Always try to see technologies from a beginners mind. You can accept corrections to your software better and leave the standard path if you need it more easily. There are some good ideas even from people who don’t have your experience.

Was there ever a software build twice, the same way? Even if you copy software it is somehow different.

4. No Ego.

Some programmers have a huge problem: their own ego. But there is no time for developing an ego. There is no time for being a rock star.

Who is it who decides about your quality as programmer? You? No. The others? Probably. But can you really compare an Apple with a Banana? No. You are an individual. You cannot compare your whole self with another human being. You can only compare a few facets.

A facet is nothing what you can be proud of. You are good at Java? Cool. The other guy is not as good as you, but better with bowling. Is Java more important than bowling? It depends on the situation. Probably you earn more money with Java, but the other guy might have more fun in life because of his bowling friends.
Can you really be proud because you are a geek? Programmers with ego don’t learn. Learn from everybody, from the experienced and from the noobs at the same time.

Kodo Sawaki once said: you are not important.
Think about it.

5. There is no career goal.

If you want to gain something and don’t care about your life “now”, you have already lost the game. Just act as well as you can, without looking at the goal you might reach after a long time.
Working for 20 years to become a partner? Why aren’t you working as hard as possible just because it is fun? Hard working can be fun. A day without work is a day without food is a Zen saying.

There is no need to start happiness after 20 years. You can be happy right now, even when you are not a Partner or don’t drive a Porsche. Things change too easily. You can get sick. You can get fired. You can burn out (if you follow all these items I guess likeliness is low).

Until these bad things happen, just work as well as you can and have fun with doing it. No reason to look at the gains of the colleges. No reason to think about the cool new position which you didn’t get.

After all, you will reach something. You’ll end up with nice memories, maybe a good position – and 20 excellent years. Every day is a good day.

If you ever come to the point were you think that working at your company is no fun at all you must leave immediately. NEVER stay at a company which does take away the happiness in your live. Of course, this is only possible in the rich countries, were people have the choice to go away. But if you are living in such an good environment, do it. Go away without regret. You have no time to waste, you are probably dead tomorrow.

When you have no career goal going away is easy.




6. Shut up.

If you don’t have anything to say, don’t waste the time of your colleagues. This doesn’t make you look wimpy. Everyday you work you need to try not getting on someones else nerves. Imagine if everybody would try this – what a great working place would that be? Sometimes it is not possible. Try hard, you will like it.

If you don’t develop an ego it is pretty easy to shut up and care on the things you have something to tell. Don mix up your ego with your “experience” and always remember: you are a beginner. If somebody has a good idea, support the idea.

7. Mindfulness. Care. Awareness.

Yes you are working. But at the same time you are living and breathing. Even when you have some hard times at work you need to listen to the signs of your body. You need to learn about the things which are good for you. This includes everything, including basic things like food. You need to care for yourself and for everything in your environment – because after all, the water you drink is the water which runs in the river. Because you are living only for yourself. You live alone and you’ll die alone. World goes on, even without you.

Avoid working situations you don’t like. Avoid working for free if it means you will have no fun and keeps you away from your bed. Let go what doesn’t make you happy. Working for free sounds is just theory? Consider the people doing Open Source in their prime time. If you have subscribed to some projects mailing list you probably know what heat there is (sometimes). If you don’t have fun with that – stop doing it. I know a bunch of people who work in an Open Source environment they don’t like. Again with Time & Bill I have tracked the time I spend in 0pen Source projects and was surprised how much time I lose there – esp. on projects I didn’t like so much.

Having this in mind, some people think they are only happy when they have prime time and can spend the evening with an xbox and some beer. While this is a good idea from time to time, it is not necessary that the whole time in your life is “fun”. If you can avoid situations you don’t like, avoid them (like I said above). But sometimes there is need to something really shitty. Like for example manually copy/pasting stuff from your managers Excel sheet into phpmyadmin. This can take you days, and it is really boring. It is no fun, but sometimes you need to do such stuff. You cannot always quit your job when you got a boring task. Zen Monks are not to shy with their work too. They get up at 4am (sometimes earlier, sometimes later, depends on the convent) and start meditation and work (they even consider work meditation practice). They have stuff to do like cleaning the toilets. Or working in the garden. Or as a Tenzo, they cook. They do it with all the care they can get. Whatever they do, they do it without suffering and they are (or should be) happy, because every second, even the second where they are cleaning toilets, is a second of their life.
That being said: stop crying, if you need to copy/paste excel. Just do it. Don’t waste your energy with such things, they will pass. Become the best excel copy/paster out there instead.

If you suffer a heart attack, people will probably say: “uh yes, he really worked too much, he even worked for me for free at night”. Nobody can guide you to the other world. This last step is taken by us alone. You cannot exchange anything in this world. Not even a fart. So it is up to you to take care, in every second. If you die, you die. But when you live you live. There is no time to waste.

“Care” is a huge word in zen buddhism (and I think in every form of buddhism). I cannot express everything which needs to be said. it is difficult to understand the different meanings of “care”. Probably you are better with the word “awareness”. You must be aware of what you do, in every second of your life. You must be mindful in your life. Otherwise you waste it. But, of course, it is up to you to do so, if you like.

8. There is no Boss

Yes, there is somebody who pays you. There is somebody who tells you what needs to be done. And he can fire you. But this is no reason to give up your own life or to become sick of your work. Finally your Boss has no control about you. It can even be doubted that you have control about you – but don’t lets go down this path.

Back to your Boss: he can make your life worse if you allow him to do so. But there is a way out. Say “No” if you need to do something which makes you sick or is against your ethics. What will happen? In worst case he will fire you. So what? If you live in western nations and if you are a coder (which is very likely when you read this) you’ll get another job.



I don’t mean to say “No” to tasks like copying CSV Data to HTML. I am speaking of 80 hours weeks and you feel your body breaks. Or if you feel that your kids could need some attention too. Or if you are forced to fire people just because your Boss doesn’t like them. Or if you are a consultant and get the job to develop software for nuclear plants (some might say it is perfectly fine to work for nuclear power companies – it is against my ethics and serves as an example) or for tanks. You can say “No”.

9. Do something else

A programmer is more than a programmer. You should do something which has nothing to do with computers. In your primetime, go sailing, fishing, diving. Do meditation, martial arts or play Shakuhachi. Whatever you do, do it with all the power you have (left). Like you do at your worktime. Do it seriously. A hobby is not just a hobby, it’s expression of who you are. Don let anybody fool you, when he says hobbies are not important. Nowadays we can effort having hobbies. I have recorded several CDs and wrote fantasy books (the latter one unpublished, I must practice more). These things have made me to the person I am now, and finally they have led me to Zen and this blog post. These days I practice Zen Shakuhachi. It is a very important aspect to my daily life.

10. There is nothing special.

A flower is beauty. But it’s just a beauty flower – nothing more. There is nothing special around it. You are a human who can program. Maybe you are good. There is nothing special around you. You are of the same kind as I am or all the others on this planet.

You need to go in the loo and you need to eat. Of course you need to sleep. After (hopefully) a long time you will die and everything you have created will be lost. Even pyramids get lost, after a long time. Do you know the names of the people who build up a pyramid? And if you do, is it important that you know? It’s not. Pyramids are there, or not. Nothing special.

Same goes to your software. The bank is earning money with your software. After you leave, nobody remembers you. There is nothing wrong around it. It is the flow of time. Nothing you should be worried about it. If you are living after the first 9 rules, you’ll see that this last project was a good and funny project. Now it’s simply time to go on and concentrate on something else.

If your comapany closes because of financial problems, no problem. Live will go on. There is no real need for a xbox, a car or something else. Most people on this planet live in deepest poorness. They don’t care on a xbox, because they would be glad to get some food or even water.

So… why exactly are you special? Because you had the luck to be born in the western territory? Because you can code? No, there is nothing special around it. You can let go you ego and live freely. Enjoy the colors and the smell of flowers around. Don’t be too sad when the winter comes and don’t be too happy when spring comes back. It is just a flow. Keep it in mind when somebody denies your application. Because the company is not so special that you need to be worried about the job.

Disclaimer

I am not a Zen monk. I am just practicing and learning. Please ask your local Zen monk if you feel there is something you need to understand deeper. Of course I can try to answer on this blog, but well, I am just a beginner. Anyway I am glad about your comment and if you would send a tweet with this pages url if you liked this post. Thanks for reading!

You want a book on Zen Programming? Click here.

Reference: The 10 rules of a Zen programmer from our JCG partner Christian Grobmeier at the PHP und Java Entwickler blog.

The 10 rules of a Zen programmer




Steve Jobs: One Last Thing 

Steve Jobs - Nhà sáng lập, cựu giám đốc điều hành thương hiệu nổi tiếng Apple. Một số ít người trên thế giới đã thay đổi cuộc sống của chúng ta từ cách giải trí, làm việc đến thói quen giao tiếp sinh hoạt hằng ngày, và Jobs là một trong số đó. Dưới sức ảnh hưởng rộng lớn của ông sau khi mất vào ngày 5/10/2011 do ung thư tuyến tiền liệt, cộng đồng mạng như Twitter đã lên tiếng rộng rãi cùng với hàng đoàn người tổ chức kỉ niệm trước các cửa hàng Apple Store. 



Bộ Film 60" HDTV sẽ cho ta thấy lại những khoảnh khắc cuộc đời ấn tượng của ông.


Review Film 




Steve Jobs: One Last Thing 

Trong bộ Film này chúng ta không chỉ xem xét về tài năng, phong cách và trí tưởng tượng tuyệt vời của Jobs mà còn nhìn cách ông đã định hình và ảnh hưởng rộng rãi đến đời sống của chúng ta như thế nào. Ta sẽ phỏng vấn những người đã một thời và hiện vẫn từng hợp tác với Jobs, như Ronald Wayne - đồng sáng lập Apple Computer; Robert Palladino- nhà thư pháp với các lớp học mà Jobs thừa nhận tạo nên cảm hứng cho ông thiết kế kiểu chữ cho máy tính Mac; Dean Hovey - người thiết kế con chuột cho Aplle cùng nhiều người khác.v.v... 



Video infomation

Container: Matroska
Runtime: 56mn 24s
Size: 1.56 GiB
Video
Codec: x264
Resolution: 1280x720
Aspect ratio: 16:9
Frame rate: 29.970 fps
Bit rate: 3 799 Kbps
Audio
English 5.1ch AAC




Fshare download link 
http://www.fshare.vn/file/TF77799KYT


Vietnamese subtitle
http://subscene.com/vietnamese/Steve-Jobs-One-Last-Thing/subtitle-567900.aspx



[Fshare.vn][Vietsub] Steve Jobs: One Last Thing 2011 720p HDTV x264 AAC-MVGroup

With the vast array of technology, language and platform choices available today, it can be very difficult to figure out where to best invest time in training your skills as a software developer.
I’m often asked advice on how to be a better programmer.
Most often the question someone asks is based on whether or not they should invest their time in a particular programming language or technology versus another.
I’ve been giving this quite a bit of thought lately and I’ve come up with what I think are the most important and timeless skills that a software developer can attain which will give them the best career opportunities and make them the most effective.

Skill 1: Solving Problems

problems
I’ve talked about the need to learn how to solve problems before and I’ve even given some steps of how to learn to solve problems, because I believe this skill is critical to any software developer.
Software development is 100% about solving problems.
Without problems there wouldn’t be a need for software.
All software is designed to solve some user problem and within that general solution is a wide array of smaller problems that make it up.
It really doesn’t matter what programming language or technology you use, if you can’t solve problems, you won’t be very good at developing software.
It is amazing how bad most developers are at solving problems.
I constantly hear complaints about job interviews that are too hard because they ask the developer to solve some difficult problem.
I’ve talked about why hard interviews are good and part of the reason is because they test a developer’s ability to solve problems.
I know that many developers still disagree with me about this point and don’t see why a site like TopCoder would improve their development skills so much, but I know from personal experience that it was the practice of solving problems on TopCoder that was the turning point in my career.
Think about a carpenter.  If you want be a successful carpenter, you should probably be good at cutting wood.  You should probably have practiced doing all kinds of cuts and using many different tools to cut wood.
It doesn’t matter how many years experience in carpentry you have had or how well you can design furniture or cabinetry if every time you try to cut wood you struggle with making the cuts.
Cutting wood is a base skill of carpentry, just like problem solving is the base skill of software development.

Skill 2: Teaching Yourself

learining
There is probably no more important skill in life than learning to learn.
This skill is especially important in software development, because no field I know of changes more rapidly than software development.
You can’t know everything about everything.  You can’t even really invest the time it takes to be a master of one particular framework or technology—things are moving way too fast!
Instead you need the ability to quickly acquire the knowledge you need for the task at hand.
If you truly want to have a skill that will propel you through your software development career, learn how to teach yourself.
The only way to develop this skill is to put it into use.  Go out and learn a new programming language or technology, even if you think you’ll never use it.  You’ll be surprised how quickly you may be able to pick it up because of the foundation you will already have in what you know.
If you can quickly adapt to the rapidly changing software development market and technologies and platforms associated with it, you will have skills that will always be in demand.
Although I am a bit skeptical of some of Tim Ferris’s claims, he has an excellent book called the 4-Hour Chef which has some great techniques about how to learn things rapidly.  (I was wanting to write a book about this very subject.)

Skill 3: Naming

naming
When people ask me what I do all day, I mostly say “read things other people name and name things.”
Ok, no one really asks me that and I wouldn’t really answer it that way, but I certainly could.
Software development is all about describing the metaphysical.  Most of what we are building can’t be seen. 
We have to construct in our minds an entire world with authorization managers taking authorization requests and spitting out authorization response alongside user repositories using user factories to assemble new users.
Every time you are writing code you are naming things.  When you read code that you or someone else has written, you are gaining most of your understanding about that code from the names of things in that code.
Most of the time I can accurately predict a developer’s skill level by looking at how they have named methods, variables and classes in code they have written.
A developer who lacks the ability to give good names to concepts and data in their code is like a mute translator.  It doesn’t matter if you can understand something, if you can’t adequately explain it, the moment it leaves your head it is gone.
The best way to improve this skill is to always put it into practice.  I’ll often rename things in code I am just reading to get an understanding.  As I start to understand what a method is doing, I’ll change the name to match that understanding.  I’ll do this while I am reading the code, not even making any logic changes to it.
The more you focus on giving good names to things, the better at it you will become.
This is also the most visible thing about your code.  It is hard to know if your code is correct or efficient by looking at it, but if I read it and can understand it, I am going to assume you know what you are doing.

Skill 4: Dealing with People

dealing
I list this as last, but in many cases you could say it is the first or most important skill.
Everywhere you go there are people.
Unless you work alone and develop software just for yourself, other people are going to influence your career as a software developer.
I’ve talked about why you might not want to criticize someone else before, but there is much more to dealing with people than not pissing them off.
I always go back to the famous book by Dale Carnegie, “How to Win Friends and Influence People,”because this book is so important in learning how to be a successful human being.
I’ve said it before, but if you want to develop people skills, read this book!
The basic problem is that humans are not logical creatures, we are emotional ones.  Sure, we like to pride ourselves on our ability to reason, but the reality is that most decisions we make are more influenced by emotion than reason.
What this means for you as a software developer is that unless you can effectively deal with other developers, managers, and even customers, you will constantly face trouble despite how good your ideas are or how valuable your skills are.
Being active and involved in the software development community in general can also help you immensely in your career.  It is not just about networking, but getting your name out there and buildinggood Karma.
Doing this successfully hinges directly on your ability to deal with people.  (Want to take a big shortcut in learning how to deal with people?  It’s simple.  Be nice!)

What about practical skills?

Notice I didn’t include anything in my list about a particular technology or even as broad a skill as web development or mobile development?
It is certainly important to have a solid foundation in a couple of technology areas, but what those areas are is not nearly as important as the 4 skills I mention above.
If you can solve problems, learn things quickly, name things well and deal with people, you will have a much greater level of success in the long run than you will in specializing in any particular technology.
With that said, of course it is important to thoroughly learn a programming language or two and to have a general area of specialization, but as long as you don’t go too far off the beaten path with those choices and you focus on these 4 important skills, you will be ok. 

The 4 Most Important Skills for a Software Developer


I was reading an interesting study last week about how willpower seems to grow like a muscle.  In the study they had found that subjects that had successfully stuck to a diet program performed better in many other areas of their life as well.
This study seemed to indicate that by having success in one area of life requiring willpower that a person would gain benefits in other willpower related areas of life such as working out, controlling temper, studying and/or working.
Basically as people trained their willpower it grew in capacity.
This study got me thinking about how all kinds of seemingly unrelated skills tend to aid us in tasks that don’t directly use them.

Digging a little deeper

digging
So what do I mean by this?
I mean that if you learn C#, you will be able to learn Java faster.  Essentially you’ll never have to be a beginner at Java.
Now that might not be any big revelation to you.  The languages are pretty close already in syntax, but I have found this principal extends much further than that.
In the years that I have been doing software development I’ve had the opportunity to work with many developers who started out their careers in totally unrelated fields.
I found that many of those developers who had significant experience in another field, but then switched to software development, very quickly acquired the skills required to become successful in software development.
I found that within about 3 years, many of those developers had the skill and knowledge equivalence of a developer that might have been in the field for 10 or more years.

Everything is the same

I’ve always been surprised by this phenomenon, but never really thought about why this was true.
I’ve worked with many different programming languages, technologies and platforms and I’ve made a pretty good study of other fields like real estate investment and options trading.  I’m constantly finding skills and knowledge I acquired in one area of interest are boosting my abilities in other areas and I finally think I know why.
There really isn’t that much variation in the very basic principles of reality.  Essentially everything fits into a handful of molds at a very fundamental level.
molds
The same kind of basic principles that define the pricing of options contracts on securities like stocks are the same basic principles that define the trade-off between time, scope and quality in software development.
At a deeper even more fundamental level you could say that a person that has learned how to work within and understand the relationships between constraints will find that skill is unconsciously applied to a thousand other areas of life which also have defined and real constraints.
Of course in software development itself we recognize many of these similarities as patterns.  What most developers don’t realize though is that patterns are natural emergences of ways to solve problems that organically occur in some form or other. The book on patterns just formalizes these patterns.
If you’ve ever heard the term Polymath before (basically a master of multiple skills or areas of study), this tends to explain why Polymaths like Leonardo da Vinci and Michelangelo were able to accomplish so much in so many areas.

Knowing what you don’t know

Another major reason why you are only a beginner once is because once you’ve been a beginner you have a better idea of what you don’t know.
question
When you start out as a beginner in something one of the biggest hurdles to success is finding out what you need to learn.  (Which is why I often recommendstarting off by scoping a subject.) 
If you were just starting out in programming and had no prior experience in with any type of related skill, you wouldn’t know to ask what kind of looping structures are available in C#, because you wouldn’t even know to ask that question.
On the other hand, if you have experience in just one programming language, you will have a whole array of questions which you can ask about that language, because you can relate it to concepts you already understand.  Often when I teach, I try to do exactly that.  I try to find something that I think you are already familiar with and relate the new concept to a well understood domain.
If you’ve learned quite a few different technologies and programming platforms, when you try to learn a new one, you’ll know what you don’t know and that will make the whole learning process much quicker.

What this means to you and me

As software developers this is great news, because the world of technology just keeps getting bigger and bigger.
It is very difficult to keep up with all the different technologies that are constantly coming out every year—it is an almost impossible task.
But fortunately we can apply this principle to our craft and realize that skills we acquire in one area of software development will help us to never have to be a beginner in other technologies and development platforms.
The key to unlocking this potential is twofold.
  1. Push through the surface to see the similarities.  Often starting out with a new technology everything seems new, but I’ve found that if you don’t give up, and you push a little further you end up in familiar territory.
  2. Constantly make the shift between technologies in order to maximize the benefit.  I’ve also found that shifting between technologies and even development languages tends to help us to unlock the ability to see things at a more fundamental level.  Think about the inductive reasoningwhere you might start out with 1 instance of a thing, then 2, then 3, then you generalize to n.
This is why it is so important to learn how to learn.  The more you learn, the easier to becomes to learn and the more synergistic the skills you acquire become.
So if you’ve been afraid to dive into a new technology because you are either afraid that you won’t be able to learn it quickly enough or that it will be a waste of time because it is unrelated to technologies you actually use, don’t be.  Instead try to remember that even though something new might be intimidating at first, you’ll most likely have a head start, because you are only a beginner once.


You’re Only a Beginner Once!