<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>programming-art &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://wordpress.com/tag/programming-art/</link>
	<description>Feed of posts on WordPress.com tagged "programming-art"</description>
	<pubDate>Mon, 13 Oct 2008 07:32:54 +0000</pubDate>

	<generator>http://wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Oops...]]></title>
<link>http://nkoehring.wordpress.com/?p=77</link>
<pubDate>Fri, 03 Oct 2008 19:46:57 +0000</pubDate>
<dc:creator>nkoehring</dc:creator>
<guid>http://nkoehring.de.wordpress.com/2008/10/03/oops/</guid>
<description><![CDATA[Na da ist wohl etwas ganz schoen schief gelaufen!
File &#8220;subprocess.py&#8221;, line 970, in _ex]]></description>
<content:encoded><![CDATA[<p>Na da ist wohl etwas ganz schoen schief gelaufen!</p>
<blockquote><p>File "subprocess.py", line 970, in _execute_child<br />
data = os.read(errpipe_read, 1048576) # Exceptions limited to 1 MB</p>
<p>MemoryError</p></blockquote>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Programmierung ist zeitaufwendig...]]></title>
<link>http://nkoehring.wordpress.com/2008/01/09/programmierung-ist-zeitaufwendig/</link>
<pubDate>Wed, 09 Jan 2008 02:03:09 +0000</pubDate>
<dc:creator>nkoehring</dc:creator>
<guid>http://nkoehring.de.wordpress.com/2008/01/09/programmierung-ist-zeitaufwendig/</guid>
<description><![CDATA[Hui, den ganzen Tag verpennt (naja, drei von vier Vorlesungen) und dann auch noch Besuch gehabt. Kei]]></description>
<content:encoded><![CDATA[<p>Hui, den ganzen Tag verpennt (naja, drei von vier Vorlesungen) und dann auch noch Besuch gehabt. Kein Wunder, dass das Programm nicht voran kommt. Aber bevor mein Besuch jetzt schlecht von mir denkt: Es war keine Kritik gegen dich, ich hab mich gefreut das du da warst und du haettest auch noch laenger bleiben koennen! ;)</p>
<p>Jedenfalls arbeite ich gerade an der Version 0.2 meines <i>Reminders</i> und werde hoffentlich noch vor dem Schlafengehen soweit sein.</p>
<p>Inzwischen kann man die Erinnerungen auch editieren und sie werden wahlweise farblich hervorgehoben, wenn sie am selben oder naechsten Tag anstehen. Außerdem ist das Aussehen ziemlich konfigurierbar geworden und ich habe eine bessere Methode gefunden, Daten (in diesem Falle der Plural von <i>Datum</i> ;) ) handzuhaben.</p>
<p>Was noch ansteht: Wenn man Aenderungen macht, sollen sie sofort erscheinen und nicht erst nach einem Neustart <b>und</b> ich habe immer noch kein Feld fuer "daysbefore", womit man einstellt, wieviele Tage vor Ablauf der Erinnerung diese angezeigt werden soll. Einstellen kann man es schon von Anfang an, aber ich habe schlicht und einfach vergessen, ein entsprechendes Feld in die GUI einzubauen :-/</p>
<p>Also dann mach ich mal weiter, jetzt wo mein Besuch weg ist ;)</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[a simple reminder]]></title>
<link>http://nkoehring.wordpress.com/2008/01/08/a-simple-reminder/</link>
<pubDate>Tue, 08 Jan 2008 03:12:06 +0000</pubDate>
<dc:creator>nkoehring</dc:creator>
<guid>http://nkoehring.de.wordpress.com/2008/01/08/a-simple-reminder/</guid>
<description><![CDATA[Hallo mal wieder&#8230;
da ich ein ziemlich zerstreuter Mensch bin, suchte ich heute nach einem nuet]]></description>
<content:encoded><![CDATA[<p>Hallo mal wieder...</p>
<p>da ich ein ziemlich zerstreuter Mensch bin, suchte ich heute nach einem nuetzlichen Programm, das mir effizient auf die Spruenge helfen kann. Ich dachte dabei an ein einfaches Teil, das ein paar "Notizzettel" auf den Desktop knallt, auf denen steht, was demnaechst bei mir ansteht.</p>
<p>Leider fand ich nach gut zehnminuetiger Recherche nichts und fing also an, mir selbst das gewuenschte Programm zu schreiben.</p>
<p>Ich programmiere schon laenger - etwa seit sechs oder sieben Jahren - vorallem mit <a href="http://www.python.org" title="Python" target="_blank">Python</a>, bin auch im <a href="http://www.python-forum.de/user-4487.html" title="Python-Forum" target="_blank">Python-Forum</a> aktiv und verdiene damit seit letztem Jahr sogar neben dem Studium Geld!</p>
<p>Nun ist es getan... den ganzen Tag habe ich daran gesessen und hier ist es zu bekommen:</p>
<ul>
<li><a href="http://paste.pocoo.org/show/20032/" title="paste.pocoo.org" target="_blank">der Code</a></li>
<li><a href="http://www.python-forum.de/post-86733.html" title="Python-Forum.de" target="_blank">der dazugehoerige Eintrag im Python-Forum</a></li>
</ul>
<p>Und jetzt geh ich schlafen. Ich werde morgen dann sicherlich hier schreiben, wieviele Vorlesungen ich mal wieder verschlafen habe :-D</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[bị chặn sao?]]></title>
<link>http://drbaby.wordpress.com/2007/02/09/b%e1%bb%8b-ch%e1%ba%b7n-sao/</link>
<pubDate>Thu, 08 Feb 2007 21:50:55 +0000</pubDate>
<dc:creator>drbaby</dc:creator>
<guid>http://drbaby.de.wordpress.com/2007/02/09/b%e1%bb%8b-ch%e1%ba%b7n-sao/</guid>
<description><![CDATA[hứng thú, mò vô blog đọc &amp; viết tí chơi, ai ngờ firefox báo not responding. Ừ t]]></description>
<content:encoded><![CDATA[<p>hứng thú, mò vô blog đọc &#38; viết tí chơi, ai ngờ firefox báo not responding. Ừ thì tình trạng này xảy ra ầm ầm, chắc mạng viettel lại leo queo roài. Nhưng quái lạ là vào các trang khác vẫn ngon lắm, thôi thì đổ tại wordpress đang đơ vậy.</p>
<p>buồn chán, mò vô blog tính viết chút, lại cũng không vào được, vào trang chủ cũng rất lâu, các blog khác thì ... không thể. Hu hu... tức khí, chơi trò fake IP nhé. Đang nắm trong tay 1 IP USA khá ngon lành, thử xem.... ồ lê, load ầm ầm. Thầm chửi rủa cái thằng viettel này chặn wordpress sao? -&#62; thế sao nó không chặn luôn trang chủ? DNS có vấn đề? -&#62; ồ ko, mình change IP mà. IP VN bị chặn?-&#62; ko bít, nhưng chặn thì 2 cái vô lý, 1 là vẫn vào được trang chủ, 2 là số lượng blogger là vietnamese khá đông. Thế tại làm sao?.... thôi thì chắc internet traffic đang có vấn đề, thông cảm vậy. hừ hừ.</p>
<p>Tức quá, giờ trình bày quy trình làm prj của mình nè, ít nhất là cái này... cái khác ko thèm nói đến.</p>
<p>hoangnd: Êu, bài toán ổn chứ?<br />
xxx: ok, nhưng tôi thấy...<br />
.... nói nói.... nói nói....<br />
hoangnd: Ổn chưa?<br />
xxx: ok, vậy để tôi làm cái nầy, ông làm cái nầy....<br />
hoangnd: ok (cười sướng).<br />
xxx: ...làm làm làm....<br />
hoangnd: ... chơi chơi chơi ....</p>
<p>.....</p>
<p>hoangnd: êu, đến đâu rùi, đưa tôi coi cái.<br />
xxx: ok, đợi mấy hôm nữa, tôi sửa mấy cái.<br />
hoangnd: ok ...  chờ chờ chờ....</p>
<p>.....</p>
<p>hoangnd: êu, xong chưa, coi cái nèo?<br />
xxx: ok, mai ngày kia tôi gửi ông.<br />
hoangnd: ok, hay đấy.</p>
<p>....</p>
<p>hoangnd: gửi chưa?<br />
xxx: ông ra đây tui chỉ nè...<br />
hoangnd: ok ok.<br />
.... chỉ chỉ chỉ ...<br />
hoangnd: huhm, đưa tôi về test cho.<br />
hoangnd: test test test ....<br />
.... tât nhiên là vài trang A4 lỗi rùi ...<br />
hoangnd: êu, tui thấy cái nầy .... nói nói ...<br />
hoangnd: lỗi tui ghi ra file word, ông ngó qua nè và sửa nhé.<br />
xxx: ok ok.</p>
<p>.... chờ chờ chờ ...<br />
hoangnd: xong chưa, ngó cái.<br />
xxx: uhm, đang sửa, được mấy cái rùi, cũng đang làm thêm nữa.<br />
hoangnd: hay quá hay quá, cố lên.</p>
<p>.... chơi chơi chơi ....</p>
<p>hoangnd: gửi tui xem zới!<br />
xxx: uhm, xem nè.<br />
hoangnd: xem xem, nhăn mặt.<br />
lại vài trang A4 lỗi...</p>
<p>hoangnd: êu, tui thấy còn lỗi nầy nầy.... và mầy cái trước chưa sửa à....<br />
xxx: ok, đang sửa<br />
hoangnd: ok ok, có gì cứ ý kiến nhé.<br />
xxx: uh, à mà tôi định.... nói nói nói...<br />
hoangnd: thoải mái đi, làm sao cho tiện nhất là được.<br />
xxx: vậy thế nhé ...</p>
<p>.... chơi chơi chơi ....</p>
<p>hoangnd: Demo đâu?<br />
xxx: xem nè<br />
hoangnd: ok, gọi thầy ra xem.<br />
thầy: #$%%^$#^#%$#%$#%#!#$()_#%$^!#<br />
xxx: ------------</p>
<p>hoangnd: uhm, thôi, để tôi về sửa lại tí giao diện, xong ông cứ thế làm nhé.<br />
xxx: ok, zậy ông làm đi.</p>
<p>... làm làm làm...<br />
hoangnd: nè, xem giao diện mẫu nè, ông làm theo thế nhé...<br />
xxx: uh uh uh...<br />
hoangnd: thui, để tui làm lại lun cho, ông gửi code đây tôi ghép.<br />
xxx: ok, vậy thế nhé.<br />
hoangnd: ghép ghép ghép....<br />
hoangnd: êu, còn mấy lỗi, ông sửa nhé vì ông làm từ đầu mà ... lỗi lỗi lỗi ... tôi ghi ra giấy nè...<br />
xxx: ok, xong ngay.</p>
<p>hoangnd:........ chờ chờ .....<br />
hoangnd: xem nèo<br />
xxx: ok, nè.<br />
hoangnd: uhm uhm, lại lục đục sửa....<br />
.... sửa sửa ...sửa ...</p>
<p>xxx: demo cho thầy phát.<br />
hoangnd:ok<br />
xxx: ông demo nhé<br />
hoangnd: ok, xong ngay</p>
<p>--- demo demo ---<br />
hoangnd: tính huống chính của tụi em xảy ra như vầy, thầy có hỏi gì ko ạ?<br />
thầy: ko, nhưng trước khi bảo vệ nhớ test kỹ hơn chút, test ác liệt vào.<br />
hoangnd: zét zét<br />
thầy: đĩa đâu<br />
hoangnd: hôm tới nhé thầy.<br />
thầy: ok, chuẩn bị đi, đĩa chứa code + tài liệu.<br />
hoangnd: zét zét.<br />
xxx: ok, ổn đấy.</p>
<p>---- chơi chơi chơi ----</p>
<p>---- chơi típ ----</p>
<p>hoangnd: prj tụi mình seo rùi ông?<br />
xxx: uhm..... tui gửi cho ông cái vừa phần tui vừa sửa rùi, ghép vào nhé, mai vác code lên apt nhé.<br />
hoangnd: ừa, ok xong ngay.</p>
<p>.... ngó ngó ngó .... test test .... sửa sửa ....<br />
-&#62; logic hơi chuối.</p>
<p>.... uhm uhm....<br />
hoangnd: uhm, cái tội ko chịu làm.<br />
hoangnd: quyết định nhé, <strong>thiết kế lại</strong></p>
<p>---&#62; pó chim. Đúng là ... ' cứt trâu để lâu hóa bùn'.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Ten recommendations for developers]]></title>
<link>http://drbaby.wordpress.com/2006/12/21/ten-recommendations-for-developers/</link>
<pubDate>Thu, 21 Dec 2006 16:17:13 +0000</pubDate>
<dc:creator>drbaby</dc:creator>
<guid>http://drbaby.de.wordpress.com/2006/12/21/ten-recommendations-for-developers/</guid>
<description><![CDATA[(thientai.blogspirit.com _ blog của thầy TanDT )
1. Add comments to your code.
2. Do not complic]]></description>
<content:encoded><![CDATA[<p>(thientai.blogspirit.com _ blog của thầy TanDT )</p>
<p>1. Add <strong>comments</strong> to your code.<br />
2. Do not complicate things.<br />
3. Keep in Mind - "Less is more" is not always better.<br />
4. No <strong>hard coding</strong> please.<br />
5. Do not invent your own frameworks.<br />
6. Say no to Print lines and String Concatenations.<br />
7. Pay attention to the <strong>GUI.</strong><br />
8. Always Prepare Document Requirements.<br />
9. Unit-test. Unit-test. Unit-<strong>test.</strong><br />
10. Remember - <strong>quality</strong>, not quantity.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[What Is A Professional Programmer?]]></title>
<link>http://drbaby.wordpress.com/2006/12/20/what-is-a-professional-programmer/</link>
<pubDate>Wed, 20 Dec 2006 04:48:15 +0000</pubDate>
<dc:creator>drbaby</dc:creator>
<guid>http://drbaby.de.wordpress.com/2006/12/20/what-is-a-professional-programmer/</guid>
<description><![CDATA[April 25th, 2006
By Sarah George
Published April 19, 2006
How do people become professional programm]]></description>
<content:encoded><![CDATA[<p>April 25th, 2006</p>
<p>By Sarah George<br />
Published April 19, 2006</p>
<p>How do people become professional programmers? Many people go the "traditional" path through a computer science or software engineering education and from there into professional programming work.</p>
<p>Others become professional programmers by accident. A person writes a small program to help at work, and their workmates say, "Oh great, you can write programs! You're our programmer now!"</p>
<p>Other people start out as hobbyists and follow a less traditional path, not always getting a degree, but clearly wanting to be programmers from the start and working actively towards that goal.</p>
<p>I've been a hobbyist programmer since I was 6. I wasn't writing anything amazing back then but I had started writing and soon found it was absorbing most of my time. Since I never really stopped, that gives me 24 years "programming experience" and counting.</p>
<p>At first I was into writing computer games. Later people asked me to write programs for them, and sometimes I even got paid. From this I learned that software is always for something. Programs are not self contained worlds of their own. People expect things out of a program that have more to do with Japanese or Geophysics or Engineering (or whatever they've got in mind) than with how a computer works. I had to learn something about all those domains in order to write programs for them.</p>
<p>At university it didn't take long before I was a tutor, and that's where I found I enjoy teaching, and especially enjoy teaching programming.</p>
<p>While I was at university I got my first "real" job, writing Visual C++ code for a financial database company. In terms of design and theory it was lightweight stuff. But in terms of working with others on a large project I was being thrown in the deep end! They had gigabytes of source code, growing cancerously through the efforts of a dozen developers of wildly differing skill levels.</p>
<p>In spite of my programming skills being well above average there, I learned to settle for being a junior programmer, a little fish in a large pond.</p>
<p>Skipping along a few more jobs and a lot more years, today I am a senior developer in a small research group—a big fish in a little pond. I've had to teach my co-workers a lot about professional programming, because most of them haven't been in industry to get that taste of what large code bases and diverse skill levels do to programs if you aren't using those "professional" skills to keep everyone pointed in the same direction.</p>
<p>There's quite a gap between "being able to program" and being a "professional programmer." It took me 15 years to go from beginner to hotshot programmer, then another 10 years to go from hotshot to professional—and I'm still learning.</p>
<p>Whatever the path we follow, most professional programmers have in common the fact that they learned to code first and how to be a professional later.</p>
<p>The Meaning of "Professional"<br />
So what does it mean to be a professional programmer? What does it mean to be a professional anything? Some definitions simply say to be a professional is "to make money from a skill," but true professionals also have a set of qualities often described as "professionalism." In my opinion, these qualities are: trustworthiness, teamwork, leadership, communication, constant updating of skills, an interest in minimizing risks and accountability. Each of these effect the professional programmer in certain ways.</p>
<p>Trustworthiness The concept of trustworthiness applies in several different ways for programmers. Can you be trusted with a job? To perform a task without someone checking up on you? Can you be trusted to ask for help when you need it?</p>
<p>If you're given clients' data or have signed a non-disclosure agreement, then you are being trusted to respect privacy. You are trusted to check license agreements on third party tools or libraries and to get licenses or permission as required. And like any professional you are trusted to simply do a good job.</p>
<p>Teamwork Will you genuinely cooperate with your team mates? Will you work to mutual advantage and not just your own? Can you trust your team to work with you? Can you do your share of the work and trust your team to do the rest? And can you accept your management (and sometimes even clients) as part of the team, everyone trying to get the same job done?</p>
<p>Leadership Showing leadership means both earning respect from others and knowing what to do with it. Recognize the skills of your team members, and make sure you can offer each person challenges and development without exceeding what they can cope with at a given time.</p>
<p>Leadership involves not always getting to do the "fun" parts of a project yourself (that scary "delegation" word). It also involves not asking anyone to do a task that you wouldn't be willing to do yourself. It's not just the managers and lead programmers who need to show leadership, it's any professional programmer. The best programmers to work with are the ones that know what's going on, not just their little tasks.</p>
<p>Communication Respecting the people you work with, and your clients, enough to really listen to them is a critical part of communication. Teamwork can't happen without good communication, nor can accountability.</p>
<p>Communication is critical for helping clients to produce usable specifications and feedback. Will you question whether the specs you are given really will serve the purpose that the client has in mind?</p>
<p>Communication skills help with making meetings timely and effective. A professional's communication is effective and to the point, whether in person, in email, on the phone or in written documents.</p>
<p>Documentation at first seems like a programmer-specific concern until you consider how many people require documentation in a serious project: other programmers need high level, API level and in-code documentation; managers need planning, progress, and bug documentation; lawyers need proof of what was done and when; and users need documentation on how to use the software.</p>
<p>Updating Skills Keeping your skills up to date involves staying aware of what's going on in your industry. What are the current ideas about methodologies like eXtreme Programming? What libraries and tools are out there that might support your project? What are the current refactoring tools? How about standards, file formats and protocols? Are you up to date with Unicode, XML, SQL, and all the other acronyms? Perhaps you're missing out on something if you're not. What platforms are your potential clients using? Should you be learning about cross platform development?</p>
<p>Basically you need to possess a genuine interest in your field, and to read broadly so you know what's out there and which areas to then read deeply about. You also need to accept that even (or should I say "especially") the very best programmers are still learning.</p>
<p>Minimizing Risks Familiarity with best practices, combined with a healthy dose of common sense, will take you a long way towards managing risks. Professional programmers keep track of known bugs or any other change they intend to make. Bugs are risks, and a simple database can prevent you having a product ship with bugs you'd simply forgotten.</p>
<p>Another risk that's often not properly considered is any and all changes to the source code. Source is your livelihood and any change can be a mistake. There's good software out there that will keep track of every revision of your source code and even help merge code that multiple people have changed.</p>
<p>Professional programmers are careful to do enough testing. A software company will generally have testers but the developers need to know how to get the most out of testers and also how to write their own unit and regression tests to make sure every change in behavior is noticed and checked by a human.</p>
<p>Keeping your code simple and well styled is another commonly overlooked way to manage risks. If anyone can look at the code and see right away what it does, you are far less likely to find bugs in it later, and you are less likely to have a junior programmer attempt to change something without understanding it first.</p>
<p>Another risk is the client changing their mind, or more often changing their specifications because they've realized it wasn't what they had in mind. Write your code to be modular and reusable and you won't have any trouble adapting it to changing needs.</p>
<p>Accountability Writing code for others is a responsibility. You need to make sure your software is reliable. You need to make sure you and the client truly understand the requirements and specifications. You need to have documentation of your work, all current and past bugs, your progress, any problems, signed-off milestones, and more. You are also required to know about some basic legal issues, like software licensing, the terms of your employment contract, and intellectual property law.</p>
<p>* * *</p>
<p>As you can see, there is a huge gap between "coding" and "professional programming." Most programming courses focus on the coding side of things, and the professional skills tend to be glossed over or not covered at all. I have found myself regularly teaching these skills to new co-workers, which highlighted the need for "professionalism skills training." Teaching my co-workers reminded me how much I enjoy teaching. I decided to teach more people by trying my hand at professional writing for a change.</p>
<p>I set up a web site, which is completely independent from my day job. The site is called Developing Programmers.com. It is devoted to teaching people how to develop into professional programmers. Since founding the site, I've been presenting the tools and ideas that I think professionals should know about.</p>
<p>Some of my articles simply refer to other sites of benefit to would-be professionals. I research other articles from scratch: tutorials, guides, and discussions of things professionals should be thinking about, like revision control, documentation, keeping your group pointed in the same direction—and of course, each of the aspects of professionalism that I listed earlier.</p>
<p>These days I consider myself to be a professional programmer, though I am still discovering the depth and breadth of what exactly that means. Perhaps that ongoing exploration of programming and of professionalism is what makes this for me a career and not just a job.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[The Art in Computer Programming]]></title>
<link>http://tuancom.wordpress.com/2006/04/25/the-art-in-computer-programming/</link>
<pubDate>Tue, 25 Apr 2006 11:55:47 +0000</pubDate>
<dc:creator>Dao Anh Tuan</dc:creator>
<guid>http://tuancom.de.wordpress.com/2006/04/25/the-art-in-computer-programming/</guid>
<description><![CDATA[By Andrew Hunt and David Thomas,
Pragmatic Progammers, LLC 
Published March 14, 2006&nbsp;
What exac]]></description>
<content:encoded><![CDATA[<p><em>By </em><a href="http://www.toolshed.com/andy.html"><em>Andrew Hunt</em></a><em> and </em><a href="http://blogs.pragprog.com/cgi-bin/pragdave.cgi"><em>David Thomas</em></a><em>,<br />
</em><a href="http://www.pragmaticprogrammer.com/"><em>Pragmatic Progammers, LLC</em></a><em> </em></p>
<p><em>Published March 14, 2006</em>&#160;</p>
<p>What exactly is software development, and why is it so hard? This is a question that continues to engage our thoughts. Is software development an engineering discipline? Is it art? Is it more like a craft?</p>
<p>We think that it is all of these things, and none of them. Software is a uniquely human endeavor, because despite all of the technological trimmings, we&#39;re manipulating little more than the thoughts in our heads. That&#39;s pretty ephemeral stuff. Fred Brooks put it rather eloquently some 30 odd years ago<a href="https://tuancom.wordpress.com/wp-admin/#references">[Bro95]</a>:</p>
<blockquote><p>&#34;The programmer, like the poet, works only slightly removed from pure thought-stuff. He builds his castles in the air, from air, creating by exertion of the imagination. Few media of creation are so flexible, so easy to polish and rework, so readily capable of realizing grand conceptual structures. (As we shall see later, this very tractability has its own problems.)&#34;</p></blockquote>
<p>In a way, we programmers are quite lucky. We get the opportunity to create entire worlds out of nothing but thin air. Our very own worlds, complete with our own laws of physics. We may get those laws wrong of course, but it&#39;s still fun.</p>
<p>This wonderful ability comes at a price, however. We continually face the most frightening sight known to a creative person: the blank page.</p>
<p>1. Writer&#39;s Block</p>
<p>Writers face the blank page, painters face the empty canvas, and programmers face the empty editor buffer. Perhaps it&#39;s not literally empty&#8212;an IDE may want us to specify a few things first. Here we haven&#39;t even started the project yet, and already we&#39;re forced to answer many questions: what will this thing be named, what directory will it be in, what type of module is it, how should it be compiled, and so on.</p>
<p>The completely empty editor buffer is even worse. Here we have an infinite number of choices of text with which to fill it.</p>
<p>So it seems we share some of the same problems with artists and writers:</p>
<ol>
<li>How to start</li>
<li>When to stop</li>
<li>Satisfying the person who commissioned the work</li>
</ol>
<p>Writers have a name for difficulties in starting a piece: they call it <i>Writer&#39;s Block</i>.</p>
<p>Sometimes writer&#39;s block is borne of fear: Fear of going in the wrong direction, of getting too far down the wrong path. Sometimes it&#39;s just a little voice in your head saying &#34;don&#39;t start yet&#34;. Perhaps your subconscious is trying to tell you that you&#39;re missing something important that you need before you can start.</p>
<p>How do other creative artists break this sort of logjam? Painters sketch; writers write a stream of consciousness. (Writers may also do lots of drugs and get drunk, but we&#39;re not necessarily advocating that particular approach.)</p>
<p>What then, is the programming equivalent of sketching?</p>
<h3>Software Sketches</h3>
<p>Sometimes you need to practice ideas, just to see if something works. You&#39;ll sketch it out roughly. If you&#39;re not happy with it, you&#39;ll do it again. And again. After all, it takes almost no time to do, and you can crumple it up and throw it away at the end.</p>
<p>For instance, there&#39;s a pencil sketch by Leonardo da Vinci that he used a <a target="_blank" href="http://www.wga.hu/html/l/leonardo/15sculpt/3trivul1.html">study for the Trivulzio equestrian monument</a>. The single fragment of paper contains several quick sketches of different views of the monument: a profile of the horse and rider by themselves, several views of the base with the figures, and so on. Even though the finished piece was to be cast in bronze, da Vinci&#39;s sketches were simply done in pencil, on a nearly-scrap piece of paper. These scribblings were so unimportant that they didn&#39;t even deserve a separate piece of paper! But they served their purpose nonetheless.<a href="https://tuancom.wordpress.com/wp-admin/#endnotes">[1]</a></p>
<p>Pencil sketches make fine prototypes for a sculpture or an oil painting. Post-It notes are fine prototypes for GUI layouts. Scripting languages can be used to try out algorithms before they&#39;re recoded in something more demanding and lower level. This is what we&#39;ve traditionally called prototyping: a quick, disposable exercise that concentrates on a particular aspect of the project.</p>
<p>In software development, we can prototype to get the details in a number of different areas:</p>
<ol>
<li>a new algorithm, or combination of algorithms</li>
<li>a portion of an object model</li>
<li>interactions and data flow between components</li>
<li>any high-risk detail that needs exploration</li>
</ol>
<p>A slightly different approach to sketching can be seen in da Vinci&#39;s <a target="_blank" href="http://www.wga.hu/html/l/leonardo/07study2/1lasts3.html"><i>Study for the Composition of the Last Supper</i></a>. In this sketch, you can see the beginnings of the placement of figures for that famous painting. The attention is not placed on any detail&#8212;the figures are crude and unfinished. Instead, da Vinci paid attention to focus, balance and flow. How do you arrange the figures, position the hands and arms in order to get the balance and flow of the entire piece to work out?</p>
<p>Sometimes you need to prototype various components of the whole to make sure that they work well together. Again, concentrate of the important aspects and discard unimportant details. Make it easy for yourself. Concentrate on learning, not doing.</p>
<p>As we say in <a href="http://www.amazon.com/exec/obidos/ASIN/020161622X/developerdots-20"><i>The Pragmatic Programmer</i></a><a href="https://tuancom.wordpress.com/wp-admin/#references">[HT00]</a>, you must firmly have in your head what you are doing before you do it. It&#39;s not at all important to get it right the first time. It&#39;s vitally important to get it right the last time.</p>
<h3>Paint Over It</h3>
<p>Sometimes the artist will sketch out a more finished looking piece, such as Rembrandt&#39;s sketch for <a target="_blank" href="http://www.museumbredius.nl/tekenaars/pics/t12-rembrandt.jpg"><i>Abraham&#39;s Sacrifice Of Isaac</i></a> in 1635. It&#39;s a crude sketch that has all of the important elements of the final painting, all in roughly the right areas. It proved the composition, the balance of light and shadow, and so on. The sketch is accurate, but not precise. There are no fine details.</p>
<p>Media willing, you can start with such a sketch, where changes are quick and easy to make, and then paint right over top of it with the more permanent, less-forgiving media to form the final product.</p>
<p>To simulate that &#34;paint over a sketch&#34; technique in software, we use a Tracer Bullet development. If you haven&#39;t read <i>The Pragmatic Programmer </i>yet, here&#39;s a quick explanation of why we call it a Tracer Bullet.</p>
<p>There are two ways to fire a big artillery gun. The first way is to carefully measure the distance to the target, compensate for wind speed and direction, the weight of the ordinance, and so on, crunch all the numbers and give the orders to fire:</p>
<p>&#34;Range 1000!&#34;</p>
<p><i>whirr. click.</i></p>
<p>&#34;Elevation 7.42!&#34;</p>
<p><i>whirr. click.</i></p>
<p>&#34;Azimuth 3.44&#34;</p>
<p><i>whirr. click.</i></p>
<p>&#34;FIRE!&#34;</p>
<p><b><i>BOOM</i></b><i>. Oh bad luck, there. Missed.</i></p>
<p>&#34;Range 2015!&#34;</p>
<p><i>whirr. click.</i></p>
<p>&#34;Elevation 9.15!&#34;</p>
<p><i>etc. . .</i></p>
<p>By the time you&#39;ve set up, checked and rechecked the numbers, and issued the orders to the grunts manning the machine, the target has long since moved.</p>
<p>In software, this kind of approach can seen in any method that emphasizes planning and documenting over producing working software. Requirements are generally finalized before design begins. Design and architecture, detailed in exquisite UML diagrams, is firmly established before any code is written (presumably that would make coders analogous to the &#34;grunts&#34; who actually fire the weapon, oblivious to the target).</p>
<p>Don&#39;t misunderstand: if you&#39;re firing a really huge missile at a known, stable target (like a city), this works out just great and is the preferable way to go. If you&#39;re shooting at something more maneuverable than a city, though, you need something that provides a bit more real-time feedback.</p>
<p>Tracer bullets.</p>
<p>With tracer bullets, you simply fill the magazine with phosphorus-tipped bullets spaced every so often. Now you&#39;ve got streaks of light showing you the path to the target right next to the live ammunition.</p>
<p>For our software equivalent, we need a skeletally thin system that does next to nothing, but does it from end to end, encompassing areas such as the database, any middleware, the application logic or business rules, and so on. Because it is so thin, we can easily shift position as we try to track the target. By watching the tracer fire, we don&#39;t have to calculate the effect of the wind, or precisely know the location of the target or the weight of the ammunition. We watch the dynamics of the entire system in motion, and adjust our aim to hit the target <i>under actual conditions</i>.</p>
<p>As with the paintings, the important thing isn&#39;t the details, but the relationships, the responsibilities, the balance, and the flow. With a proven base&#8212;however thin it may be&#8212;you can proceed in greater confidence towards the final product.</p>
<h3>Group Writer&#39;s Block</h3>
<p>Up till now, we&#39;ve talked about writer&#39;s block as it applies to you as an individual. What do you do when the entire team has a collective case of writer&#39;s block? Teams that are just starting out can quickly become paralyzed in the initial confusion over roles, design goals, and requirements.</p>
<p>One effective way to get the ball rolling is to start the project off with a group-wide, tactile design session. Gather all of the developers in a room<a href="https://tuancom.wordpress.com/wp-admin/#endnotes">[2]</a> and provide sets of Lego blocks, plenty of Post-It notes, whiteboards and markers. Using these, proceed to talk about the system you&#39;ll be building and how you think you might want to build it.</p>
<p>Keep the atmosphere loose and flexible; this gets the team comfortable with the idea of change. Because this is low inertia design, anyone can contribute. It&#39;s well within any participant&#39;s skills to walk up to the whiteboard and move a PostIt-note, or to grab a few Lego blocks and rearrange them. That&#39;s not necessarily true of a CASE tool or drawing software: those tools do not lend themselves readily to rapid-feedback, group interaction.</p>
<p>Jim Highsmith offers us a most excellent piece of advice: The best way to get a project done faster is to start sooner. Blast through that writer&#39;s block, and just start.</p>
<h3>Just Start</h3>
<p>Whether you&#39;re using prototypes or tracer bullets, individually or with a group, you&#39;re working&#8212;not panicking. You&#39;re getting to know the subject, the medium, and the relationship between the two. You&#39;re warmed up, and have started filling that blank canvas.</p>
<p>But we have one additional problem that the painters do not have. We face not one blank canvas per project, but hundreds. Thousands, maybe. One for every new module, every new class, every new source file. What can we do to tackle that multiplicity of blank of canvases? The Extreme Programming<a href="https://tuancom.wordpress.com/wp-admin/#references">[Bec00]</a> notion of Test First Design can help.</p>
<p>The first test you are supposed to write&#8212;before you even write the code&#8212;is a painfully simple, nearly trivial one. It seems to do almost nothing. Maybe it only instantiates the new class, or simply calls the one routine you haven&#39;t written yet. It sounds so simple, and so stupid, that you might be tempted not to do it.</p>
<p>The advantage to starting with such a trivial test is that it helps fill in the blank canvas without facing the distraction of trying to write production code. By just writing this very simple test, you have to get a certain level of infrastructure in place and answer the dozen or so typical startup questions: What do I call it? Where do I put it in the development tree? You have to add it to version control, and possibly to the build and/or release procedures. Suddenly, a very simple test doesn&#39;t look so simple any more. So ignore the exquisite logic of the routine you are about to write, and get the one-line test to compile and work first. Once that test passes, you can now proceed to fill in the canvas&#8212;it&#39;s not blank anymore. You&#39;re not writing anything from scratch, you&#39;re just adding a few routines. . . .</p>
<p><strong>2. When to Stop</strong></p>
<p>We share another problem with painters: knowing when to stop. You don&#39;t want to stop prematurely; the project won&#39;t yet be finished.<a href="https://tuancom.wordpress.com/wp-admin/#endnotes">[3]</a> But if you don&#39;t stop in time, and keep adding to it unnecessarily, the painting becomes lost in the paint and is ruined.</p>
<p>There&#39;s only one way avoid either trap: feedback. Before you even start a particular task, you have to have a way to determine that you&#39;re done. For example:</p>
<table border="1" cellPadding="0" cellSpacing="0">
<tr>
<td width="120" vAlign="top">
<p class="DevStarNormal"><b>A. . .</b></p>
</td>
<td width="342" vAlign="top">
<p class="DevStarNormal"><b>is done when. . .</b></p>
</td>
</tr>
<tr>
<td width="120" vAlign="top">
<p class="DevStarNormal">Project</p>
</td>
<td width="342" vAlign="top">
<p class="DevStarNormal">Customer accepts</p>
</td>
</tr>
<tr>
<td width="120" vAlign="top">
<p class="DevStarNormal">Development</p>
</td>
<td width="342" vAlign="top">
<p class="DevStarNormal">Passes functional tests</p>
</td>
</tr>
<tr>
<td width="120" vAlign="top">
<p class="DevStarNormal">Module</p>
</td>
<td width="342" vAlign="top">
<p class="DevStarNormal">Passes unit tests</p>
</td>
</tr>
<tr>
<td width="120" vAlign="top">
<p class="DevStarNormal">Bug fix</p>
</td>
<td width="342" vAlign="top">
<p class="DevStarNormal">Test that previously failed now passes</p>
</td>
</tr>
<tr>
<td width="120" vAlign="top">
<p class="DevStarNormal">Meeting</p>
</td>
<td width="342" vAlign="top">
<p class="DevStarNormal">objective for meeting achieved</p>
</td>
</tr>
<tr>
<td width="120" vAlign="top">
<p class="DevStarNormal">Document</p>
</td>
<td width="342" vAlign="top">
<p class="DevStarNormal">Deliver exactly what&#39;s needed</p>
</td>
</tr>
<tr>
<td width="120" vAlign="top">
<p class="DevStarNormal">Talk</p>
</td>
<td width="342" vAlign="top">
<p class="DevStarNormal">Done when audience throws rotten fruit</p>
</td>
</tr>
<tr>
<td width="120" vAlign="top">
<p class="DevStarNormal">Paper</p>
</td>
<td width="342" vAlign="top">
<p class="DevStarNormal">You <i>are </i>still reading this, right?</p>
</td>
</tr>
</table>
<p>We had a client once who seemed to have some difficulty in the definition of &#34;done&#34; with regard to code. After toiling for weeks and weeks on a moderately complex piece of software, Matthew (not his real name) proudly announced the Code Was Done. He went on to explain that it didn&#39;t always produce the correct output. Oh, and every now and again, the code would crash for no apparent reason. But it&#39;s done. Unfortunately, wishful thinking alone doesn&#39;t help us get working software out to users.</p>
<p>It&#39;s easy to err on the other side of the fence too&#8212;have you ever seen a developer make a career of one little module? Have you ever done that? It can happen for any number of political reasons (&#34;I&#39;m still working on XYZ, so you can&#39;t reassign me yet&#34;), or maybe we just fall in love with some particularly elegant bit of code. But instead of making the code better and better, we actually run a huge risk of ruining it completely. Every line of code <i>not written </i>is correct&#8212;or at least, guaranteed not to fail. Every line of code we write, well, there are no guarantees. Each extra line carries some risk of failure, carries an additional cost to maintain, document, and teach a newcomer. When you multiply it out, any bit of code that isn&#39;t absolutely necessary incurs a shockingly large cost. Maybe enough to kill the project.</p>
<p>How then, can we tell when it&#39;s time to stop?</p>
<h3>Painting Murals</h3>
<p>Knowing when to stop is especially hard when you can&#39;t see the whole thing that you&#39;re working on. Mural painting, for instance, takes a special eye. In corporate software development, you may only ever see the one little piece of detail that you&#39;re working on. If you watch mural painters up close, it&#39;s quite difficult to discern that the splash of paint they&#39;re working on is someone&#39;s hand, or eyeball. If you can&#39;t see the big picture, you won&#39;t be able to see how you fit in.</p>
<p>The opposite problem is even worse&#8212;suppose you&#39;re the lone developer on a project of this size. Most muralists are simply painting walls, but anyone who&#39;s ever painted their house can tell you that ceilings are a lot harder than walls, especially when the ceiling in question covers 5,000 square feet and you have to lie on your back 20 meters above the floor to paint it. So what did Michelangelo do when planning to paint the <a target="_blank" href="http://en.wikipedia.org/wiki/Sistine_Chapel">Sistine Chapel</a>? The same thing you should do when faced with a big task.</p>
<p>Michelangelo divided his mural into panels: separate, free-standing areas, each of which tells a story. But he did so fairly carefully, such that the panels exhibit these characteristics:</p>
<ul>
<li>High cohesion</li>
<li>Low coupling</li>
<li>Conceptual integrity</li>
</ul>
<p>These are things we can learn from.</p>
<h3>Cohesion</h3>
<p>What is cohesion? As used here, cohesion refers to the panel&#39;s focus and clarity of purpose. In the Sistine Chapel ceiling, each panel tells a single Old Testament story&#8212;completely, but without any extraneous elements.</p>
<p>In software, the Unix command line tool&#39;s philosophy of small, sharp tools (&#34;do one thing and do it well&#34;) is one example. Each tool is narrowly focused on it&#39;s primary task. Low cohesion occurs when you have giant &#34;manager&#34; classes that try to do too many disparate things at once.</p>
<h3>Coupling</h3>
<p>Coupling is related to orthogonality<a href="https://tuancom.wordpress.com/wp-admin/#references">[HT00]</a>: unrelated things should remain, well, unrelated. Following the object-oriented principle of encapsulation helps to prevent unintended coupling, but there are still other ways to fall into the coupling trap. Michelangelo&#39;s panels have low coupling; they are all self-contained; there are no instances of figures reaching from one panel into the next, for instance. Why is that important?</p>
<p>If you look closely at one of the panels that portrays angels gliding about the firmament of heaven, you&#39;ll notice that one of the angels is turning his back to, and gliding away from, the other angels. You&#39;ll also notice that said angel isn&#39;t wearing any pants. He&#39;s rather pointedly &#34;mooning&#34; the other angels.</p>
<p>There is surely a tale that explains the bare tail of the mooning angel, but for now let&#39;s assume that the Pope discovered the mooning angel and demanded that it be replaced. If the panels weren&#39;t independent, then the replacement of one panel would entail replacing some adjacent panels as well&#8212;and if you had to use different pigments because the originals weren&#39;t available, maybe you have to replace the <i>next </i>set of panels that were indirectly affected. Let the nightmare begin. But as it stands, the panels are independent, so the offending angel (who was apparently on Spring Break) could have been easily replaced with a less caustic image and the rest of the project would remain unaffected.</p>
<h3>Conceptual Integrity</h3>
<p>But despite that independence, there is conceptual integrity&#8212;the style, the themes, the mood, tie it all together. In computer languages, Smalltalk has conceptual integrity, so does Ruby, so does C. C++ doesn&#39;t: it tries to be too many things at once, so you get an awkward marriage of concepts that don&#39;t really fit together well.</p>
<p>The trick then is to divide up your work while maintaining a holistic integrity; each Sistine Chapel panel is a separate piece of art, complete unto itself, but together they tell a coherent story.</p>
<p>For our projects, we have several techniques we need to use inside code, including modularity, decoupling, and orthogonality. At the project level, consider architecting the project as a collection of many small applications that work together. These interacting applications might simply use a network connection or even flat files, or a heavier-duty component technology such as Enterprise Java Beans (EJB).</p>
<h3>Time</h3>
<p>Up until now, we&#39;ve concentrated on splitting up a project in space, but there is another very import dimension that we need to touch on briefly&#8212;time. In the time dimension, you need to use iterations to split up a project.</p>
<p>Generally speaking, you don&#39;t want to go more than a few weeks without a genuine deliverable. Longer than that introduces too large of a feedback gap&#8212;you can&#39;t get the feedback quickly enough in to act on it. Iterations need to be short and regular in order to provide the most beneficial feedback.</p>
<p>The other important thing about iterations is that there is no such thing as 80% done. You can&#39;t get 80% pregnant&#8212;it&#39;s a Boolean condition. We want to get to the position where we only ship what really works, and have the team agree on the meaning of words like &#34;done&#34;. If a feature isn&#39;t done, save it for the next iteration. As the iterations are short, that&#39;s not too far off.</p>
<p>In time or space, feedback is critical. For individual pieces of code, it is vital to have competent unit tests that will provide that feedback. Beware of excuses such as &#34;oh, that code&#39;s too complicated to test.&#34; If it&#39;s too complicated to test, then it logically follows that the code is too complicated to write! If the code seems to be too complicated to test, that&#39;s a warning sign that you have a poor design. Refactor the code in order to make it easy to test, and you&#39;ll not only improve the feedback loop (and the future extensibility and maintainability of the system), you&#39;ll improve the design of the system itself.</p>
<p><strong>3. Satisfying the Sponsor</strong></p>
<p>Now comes the hard part. So far, we&#39;ve talked about problems that have simple, straightforward answers. Organize your system this way; always have good unit tests; look for and apply feedback to improve the code and the process; etc. But now we&#39;re headed into much more uncertain terrain&#8212;dealing with people. In particular, dealing with the sponsor: the person or persons who are paying to make this project happen. They have goals and expectations all their own, and probably do not understand the technology with which we create the work. They may not know exactly what they want, but they want the project to come out perfect in the end.</p>
<p>This must be the artist&#39;s worst nightmare. The person paying for the portrait is also sitting for it, and says simply &#34;Make me Look Good&#34;. The fact that the sitter is royalty who commands a well-oiled guillotine doesn&#39;t help. Sounds pretty close to the position we find ourselves in as we write software, doesn&#39;t it?</p>
<p>Let&#39;s look at it from the sitter&#39;s point of view. You commission an artist to paint you. What do you get? Perhaps a traditional, if somewhat flat looking portrait such as da Vinci&#39;s <a target="_blank" href="http://en.wikipedia.org/wiki/Image:Ginevra_de_Benci.jpg"><i>Portrait of Ginevra Benci</i></a> in 1474. Or maybe the realistic, haunting face of Vermeer&#39;s <a target="_blank" href="http://en.wikipedia.org/wiki/Image:Girlwithapearlearringpainting.jpg"><i>Girl With a Pearl Earring</i></a>. How about the primitive (and topless) look of Matisse&#39;s <a target="_blank" href="http://www.modjourn.brown.edu/mjp/Image/matisse/seatdfig.18.jpg"><i>Seated Figure</i></a>, the wild and fractured <a target="_blank" href="http://en.wikipedia.org/wiki/Image:Gris.picasso.jpg"><i>Portrait of Picasso</i></a> by Juan Gris, or the stick-figured jumble of Paul Klee&#39;s <a target="_blank" href="http://photos1.blogger.com/img/108/968/400/Paul_Klee-Captive.jpg"><i>Captive</i></a>?</p>
<p>All of these are portraits, all interpretations of a commonplace thing&#8212;a human face. All of which correctly implement the requirements, but all of which will <i>not </i>satisfy the client.</p>
<h3>Beyond The Obvious</h3>
<p>Each of these paintings captures the essence of a person, not just the form. More than simple photographs, each painting looks below the surface to capture something that the camera can&#39;t. As programmers, we must do the same thing, only we tend to call it <i>abstraction</i>.</p>
<p>The phrase &#34;requirements gathering&#34; implies that requirements are simply lying about, ready to be scooped up and worked on. That&#39;s akin to a simple photograph, in that it only examines the obvious, surface level elements. In order to emulate the painter, we need to go beyond what&#39;s asked for. We need to ask the wicked questions to help the client discover what&#39;s really needed.</p>
<p>Systems Thinking<a href="https://tuancom.wordpress.com/wp-admin/#references">[Sen90]</a> suggests asking a minimum of five &#34;whys&#34; beyond the first one. The classic example involves a factory floor where the consultant notices a small puddle of oil on the floor. He asks the shop manager about it, who grumbles and barks an order to the cleaning crew to get over here and clean up the oil. But the consultant persists: why is the oil there? The manager says it&#39;s the cleaning crew&#39;s fault. But where did the oil come from?</p>
<p>A little investigating and more than five &#34;why&#34; questions later, it turns out that an overly cost-conscious purchasing agent got a deal on cases of O-ring seals for the overhead pipes. Problem was, the rings were the wrong size&#8212;that&#39;s why they were such a deal. What seemed like a cost savings was in fact costing quite a bit of money in various ways.</p>
<p>We once were approached to develop a complex, enterprise-level data processing system that mail room staff would use to coordinate, sort, and track incoming payment checks prior to their distribution to the correct department. The company&#39;s current manual procedure was error-prone and unreliable; checks were being lost or misrouted to the destination department.</p>
<p>What&#39;s the real requirement here? A fancy system to sort and catalog mail for the sole purpose of delivering it to the right address? Hmm. Seems like there&#39;s already a system in place that handles that sort of thing. So instead of a nice, fat, year-long contract, we told the company to use a different postal address for each department. Let the Post Office do the sorting, hopefully without opening the pieces and losing the checks.</p>
<p>Requirements are rarely simple, and shouldn&#39;t be taken at face value. Remember, a portrait is more than just a picture.</p>
<h3>Conventional Wisdom</h3>
<p>Even stories about requirements may need deeper examination.</p>
<p>There&#39;s a marvelous story of technology and consultants gone wild, developing the Fisher Space Pen. The story goes that the U.S. Government spent millions of dollars of taxpayer&#39;s money developing a space pen&#8212;a pen that the astronauts could take to the moon that would operate in the harsh conditions of weightlessness, extreme heat and cold. Technology rushes to the rescue, and develops a miracle pen that can write upside down in a boiling toilet.</p>
<p>The Russians, by comparison, decided to use a pencil.</p>
<p>A marvelous tale of an inappropriate solution, except for one small problem. It&#39;s not true. Both the Russian and the U.S. astronauts used pencils at first, but there was a danger of the leads breaking and shorting out electric components, and the wood of the pencil itself was combustible as well. In a pure oxygen atmosphere, that&#39;s a really bad thing. The Fisher corporation realized this and, at its own cost, designed the Fisher Space Pen, which it then sold to NASA at reasonable cost. After the disastrous Apollo One fire, NASA made the Fisher pens mandatory.</p>
<p>Fisher listened to the real requirement, even before the client knew it. In time, NASA came to realize that they were right. It was an appropriate use of high-technology to solve a very real problem.</p>
<h3>Technology For It&#39;s Own Sake</h3>
<p>Of course, there&#39;s always the inappropriate solution: engineering for it&#39;s own sake. As luck would have it, we happen to have an anecdote for this case as well.</p>
<p>There was this company that had developed a sophisticated video camera that could pan and tilt, looking for a subject in its field of view. A wonderful, high-tech solution in search of a problem. In time, the company sold this technology to a government agency to help take pictures for driving licenses. You&#39;d go into the licensing agency and have a seat in front of the machine, which would whir and click, grind and gyrate until it had locked onto your face. The flash would fire, and in a few minutes your completed driver&#39;s license would be ready.</p>
<p>One day, 58 year-old Fred complained that the pretty 20 year-old blonde girl on his license just didn&#39;t look much like him.</p>
<p>The company and the government agency kinda scratched their heads; they weren&#39;t sure what the problem was. Problems like Fred&#39;s were popping up over, but other then getting a bunch in a row, there didn&#39;t seem to be any pattern to it. Finally, the police started to complain&#8212;and got quite upset&#8212;when they started seeing driver&#39;s licenses that featured beaming, cartoon smiley faces instead of a photo.</p>
<p>They discovered that the technology had gone awry: in some cases, the camera wouldn&#39;t get a lock, and would simply continue to grind and whir, looking all over the room for the subject. After a few minutes of watching the camera carefully inspect the ceiling and windows, folks like Fred would get bored and wander off. The next driver comes in, and with a flourish of clicks and whirs, the camera would snap their picture&#8212;and associate it with the previous driver&#39;s license.</p>
<p>Now the office staff figured out pretty quickly what the problem was, but they had no feedback path to the developers. They knew that once the machine got out of sync, they&#39;d get bad licenses all day. So one clever user figured out that one could draw a happy face with marker on a piece of white paper, stick that over the chair, and the machine would happily snap the picture.</p>
<p>The real requirements were ignored in the rush to be clever, with predictably poor results.</p>
<h3>How We Do It</h3>
<p>So how do you find out what&#39;s in the client&#39;s head? At The Pragmatic Programmer&#39;s offices, we use &#34;special equipment&#34; (picture a 1950&#39;s mad scientist&#39;s laboratory replete with buzzing vacuum tubes, arcing Jacob&#39;s Ladders, and cranial implants). If that doesn&#39;t work, or if we&#39;re out in the field where health and safety restrictions prevent us from using our &#34;special equipment&#34;, we resort to the old fashioned method of asking questions, both of the client and of ourselves.</p>
<p>What is the user&#39;s level of sophistication? What is the context in which the software is used? Real-time on the factory floor? In a life-critical system? For a home grocery list? What is the lifetime of the application? Unused after next week, or do you need to worry about the year-2038 bug? What are the risks? Not just the development or technical risks, but what are the <i>sponsor&#39;s </i>risks in taking on this project?</p>
<p>The best way to get these questions answered, of course, is to always involve the users as you go along. Seek frequent feedback to make sure you hear stories about anyone making smiley faces as soon as it happens.<a href="https://tuancom.wordpress.com/wp-admin/#endnotes">[4]</a> Maintain short iterations with frequent deliveries, and work with the real users directly as much as possible. User representatives (such as a supervisor, manager or director) generally aren&#39;t as representative as we&#39;d all like to think.</p>
<p>In our perpetual rush to jump in and start coding to the first neat idea we come across, we run the risk of getting locked in to a half-baked idea too early. Instead, try to cultivate emergence: Allow the solution to find itself where you can. Part of a developer&#39;s job is to provide a fertile ground in which ideas can grow. This means having code that is agile: code that supports rapid reassembly so you can try things out. Code that is easy to refactor, or that uses flexible configuration and/or metadata to facilitate rapid&#8212;but reliable&#8212;change, bolstered by a reliable safety net of complete revision control and competent unit tests.</p>
<p>Does all of this really work?</p>
<p>Yes, it does. We&#39;ve done it successfully, we know other people who&#39;ve done it successfully. It&#39;s lot of work, and it&#39;s a lot of hard work, and despite our best intentions, it might still not be a success due to factors beyond our control. So why do we bother with it all?</p>
<p>Because, as Brooks said, we programmers create. We can create awe-inspiring works with little more than the exertion of the imagination. Why do we do it? We do it for the pleasure of watching them show it off to others, of watching them use in novel ways we&#39;d never imagined. For the thrill of watching millions on millions of dollars in transactions flow through your application, confident in the results. For the joy of building and being part of a team, and for the satisfaction of knowing that you started with a blank canvas and produced a work of art. And if you&#39;ve gone to all that trouble, we think you should &#34;sign your work&#34;. You should be proud of it.</p>
<p>It is, after all, a work of art.</p>
<p>###<a name="endnotes" href="https://tuancom.wordpress.com/wp-admin/#" title="endnotes">&#160;</a></p>
<p><strong>Endnotes</strong></p>
<p><b>1</b>&#160;Sadly, the project&#39;s sponsor canceled the monument due to lack of funds. Some things never change.</p>
<p><b>2</b>&#160;If you&#39;ve got more developers on the team than will fit in an ordinary room, then you&#39;ve got bigger problems than we can address here.</p>
<p><b>3</b>&#160;In software as well as in modern art, the distinction between intentional and accidental omissions is often difficult to make.</p>
<p><b>4</b>&#160;Again, the longer the gap before you get feedback the higher the likelihood of getting feedback in the form of a subpoena.</p>
<p><a name="references" href="https://tuancom.wordpress.com/wp-admin/#" title="references"></a><strong>References</strong></p>
<p>[Bec00] Kent Beck. Extreme Programming Explained: Embrace Change. Addison-Wesley, Reading, MA, 2000.</p>
<p>[Bro95] Frederick P. Brooks, Jr. The Mythical Man Month: Essays on Software Engineering. Addison-Wesley, Reading, MA, anniversary edition, 1995.</p>
<p>[HT00] Andrew Hunt and David Thomas. The Pragmatic Programmer. Addison-Wesley, Reading, MA, 2000.</p>
<p>[Sen90] Peter Senge. The Fifth Discipline: The Art and Practice of the Learning Organization. Currency/Doubleday, New York, NY, 1990.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[What Is A Professional Programmer?]]></title>
<link>http://tuancom.wordpress.com/2006/04/25/what-is-a-professional-programmer/</link>
<pubDate>Tue, 25 Apr 2006 08:41:42 +0000</pubDate>
<dc:creator>Dao Anh Tuan</dc:creator>
<guid>http://tuancom.de.wordpress.com/2006/04/25/what-is-a-professional-programmer/</guid>
<description><![CDATA[By Sarah George
Published April 19, 2006
How do people become professional programmers? Many people ]]></description>
<content:encoded><![CDATA[<p><em>By Sarah George<br />
Published April 19, 2006</em></p>
<p>How do people become professional programmers? Many people go the &#34;traditional&#34; path through a computer science or software engineering education and from there into professional programming work.</p>
<p>Others become professional programmers by accident. A person writes a small program to help at work, and their workmates say, &#34;Oh great, you can write programs! You&#39;re our programmer now!&#34;</p>
<p>Other people start out as hobbyists and follow a less traditional path, not always getting a degree, but clearly wanting to be programmers from the start and working actively towards that goal.</p>
<p>I&#39;ve been a hobbyist programmer since I was 6. I wasn&#39;t writing anything amazing back then but I had started writing and soon found it was absorbing most of my time. Since I never really stopped, that gives me 24 years &#34;programming experience&#34; and counting.</p>
<p>At first I was into writing computer games. Later people asked me to write programs for them, and sometimes I even got paid. From this I learned that software is always for something. Programs are not self contained worlds of their own. People expect things out of a program that have more to do with Japanese or Geophysics or Engineering (or whatever they&#39;ve got in mind) than with how a computer works. I had to learn something about all those domains in order to write programs for them.</p>
<p>At university it didn&#39;t take long before I was a tutor, and that&#39;s where I found I enjoy teaching, and especially enjoy teaching programming.</p>
<p>While I was at university I got my first &#34;real&#34; job, writing Visual C++ code for a financial database company. In terms of design and theory it was lightweight stuff. But in terms of working with others on a large project I was being thrown in the deep end! They had gigabytes of source code, growing cancerously through the efforts of a dozen developers of wildly differing skill levels.</p>
<p>In spite of my programming skills being well above average there, I learned to settle for being a junior programmer, a little fish in a large pond.</p>
<p>Skipping along a few more jobs and a lot more years, today I am a senior developer in a small research group&#8212;a big fish in a little pond. I&#39;ve had to teach my co-workers a lot about professional programming, because most of them haven&#39;t been in industry to get that taste of what large code bases and diverse skill levels do to programs if you aren&#39;t using those &#34;professional&#34; skills to keep everyone pointed in the same direction.</p>
<p>There&#39;s quite a gap between &#34;being able to program&#34; and being a &#34;professional programmer.&#34; It took me 15 years to go from beginner to hotshot programmer, then another 10 years to go from hotshot to professional&#8212;and I&#39;m still learning.</p>
<p>Whatever the path we follow, most professional programmers have in common the fact that they learned to code first and how to be a professional later.</p>
<p><strong>The Meaning of &#34;Professional&#34;</strong><br />
So what does it mean to be a professional programmer? What does it mean to be a professional anything? Some definitions simply say to be a professional is &#34;to make money from a skill,&#34; but true professionals also have a set of qualities often described as &#34;professionalism.&#34; In my opinion, these qualities are: trustworthiness, teamwork, leadership, communication, constant updating of skills, an interest in minimizing risks and accountability. Each of these effect the professional programmer in certain ways.</p>
<p><em><strong>Trustworthiness</strong> </em>The concept of trustworthiness applies in several different ways for programmers. Can you be trusted with a job? To perform a task without someone checking up on you? Can you be trusted to ask for help when you need it?</p>
<p>If you&#39;re given clients&#39; data or have signed a non-disclosure agreement, then you are being trusted to respect privacy. You are trusted to check license agreements on third party tools or libraries and to get licenses or permission as required. And like any professional you are trusted to simply do a good job.</p>
<p><strong><em>Teamwork</em></strong> Will you genuinely cooperate with your team mates? Will you work to mutual advantage and not just your own? Can you trust your team to work with you? Can you do your share of the work and trust your team to do the rest? And can you accept your management (and sometimes even clients) as part of the team, everyone trying to get the same job done?</p>
<p><strong><em>Leadership</em></strong> Showing leadership means both earning respect from others and knowing what to do with it. Recognize the skills of your team members, and make sure you can offer each person challenges and development without exceeding what they can cope with at a given time.</p>
<p>Leadership involves not always getting to do the &#34;fun&#34; parts of a project yourself (that scary &#34;delegation&#34; word). It also involves not asking anyone to do a task that you wouldn&#39;t be willing to do yourself. It&#39;s not just the managers and lead programmers who need to show leadership, it&#39;s any professional programmer. The best programmers to work with are the ones that know what&#39;s going on, not just their little tasks.</p>
<p><strong><em>Communication</em></strong> Respecting the people you work with, and your clients, enough to really listen to them is a critical part of communication. Teamwork can&#39;t happen without good communication, nor can accountability.</p>
<p>Communication is critical for helping clients to produce usable specifications and feedback. Will you question whether the specs you are given really will serve the purpose that the client has in mind?</p>
<p>Communication skills help with making meetings timely and effective. A professional&#39;s communication is effective and to the point, whether in person, in email, on the phone or in written documents.</p>
<p>Documentation at first seems like a programmer-specific concern until you consider how many people require documentation in a serious project: other programmers need high level, API level and in-code documentation; managers need planning, progress, and bug documentation; lawyers need proof of what was done and when; and users need documentation on how to use the software.</p>
<p><strong><em>Updating Skills</em></strong> Keeping your skills up to date involves staying aware of what&#39;s going on in your industry. What are the current ideas about methodologies like eXtreme Programming? What libraries and tools are out there that might support your project? What are the current refactoring tools? How about standards, file formats and protocols? Are you up to date with Unicode, XML, SQL, and all the other acronyms? Perhaps you&#39;re missing out on something if you&#39;re not. What platforms are your potential clients using? Should you be learning about cross platform development?</p>
<p>Basically you need to possess a genuine interest in your field, and to read broadly so you know what&#39;s out there and which areas to then read deeply about. You also need to accept that even (or should I say &#34;especially&#34;) the very best programmers are still learning.</p>
<p><strong><em>Minimizing Risks</em></strong> Familiarity with best practices, combined with a healthy dose of common sense, will take you a long way towards managing risks. Professional programmers keep track of known bugs or any other change they intend to make. Bugs are risks, and a simple database can prevent you having a product ship with bugs you&#39;d simply forgotten.</p>
<p>Another risk that&#39;s often not properly considered is any and all changes to the source code. Source is your livelihood and any change can be a mistake. There&#39;s good software out there that will keep track of every revision of your source code and even help merge code that multiple people have changed.</p>
<p>Professional programmers are careful to do enough testing. A software company will generally have testers but the developers need to know how to get the most out of testers and also how to write their own unit and regression tests to make sure every change in behavior is noticed and checked by a human.</p>
<p>Keeping your code simple and well styled is another commonly overlooked way to manage risks. If anyone can look at the code and see right away what it does, you are far less likely to find bugs in it later, and you are less likely to have a junior programmer attempt to change something without understanding it first.</p>
<p>Another risk is the client changing their mind, or more often changing their specifications because they&#39;ve realized it wasn&#39;t what they had in mind. Write your code to be modular and reusable and you won&#39;t have any trouble adapting it to changing needs.</p>
<p><strong><em>Accountability</em></strong> Writing code for others is a responsibility. You need to make sure your software is reliable. You need to make sure you and the client truly understand the requirements and specifications. You need to have documentation of your work, all current and past bugs, your progress, any problems, signed-off milestones, and more. You are also required to know about some basic legal issues, like software licensing, the terms of your employment contract, and intellectual property law.</p>
<p align="center">* * *</p>
<p>As you can see, there is a huge gap between &#34;coding&#34; and &#34;professional programming.&#34; Most programming courses focus on the coding side of things, and the professional skills tend to be glossed over or not covered at all. I have found myself regularly teaching these skills to new co-workers, which highlighted the need for &#34;professionalism skills training.&#34; Teaching my co-workers reminded me how much I enjoy teaching. I decided to teach more people by trying my hand at professional writing for a change.</p>
<p>I set up a web site, which is completely independent from my day job. The site is called Developing Programmers.com. It is devoted to teaching people how to develop into professional programmers. Since founding the site, I&#39;ve been presenting the tools and ideas that I think professionals should know about.</p>
<p>Some of my articles simply refer to other sites of benefit to would-be professionals. I research other articles from scratch: tutorials, guides, and discussions of things professionals should be thinking about, like revision control, documentation, keeping your group pointed in the same direction&#8212;and of course, each of the aspects of professionalism that I listed earlier.</p>
<p>These days I consider myself to be a professional programmer, though I am still discovering the depth and breadth of what exactly that means. Perhaps that ongoing exploration of programming and of professionalism is what makes this for me a career and not just a job.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Some about JabberCOM]]></title>
<link>http://tuancom.wordpress.com/2006/04/03/some-about-jabbercom/</link>
<pubDate>Mon, 03 Apr 2006 10:42:51 +0000</pubDate>
<dc:creator>Dao Anh Tuan</dc:creator>
<guid>http://tuancom.de.wordpress.com/2006/04/03/some-about-jabbercom/</guid>
<description><![CDATA[http://www.jabber.org/cvs/win32-dev/
http://sourceforge.net/projects/v2j/
&nbsp;http://groups.google]]></description>
<content:encoded><![CDATA[<p>http://www.jabber.org/cvs/win32-dev/</p>
<p>http://sourceforge.net/projects/v2j/</p>
<p>&#160;http://groups.google.com/group/google-talk-open/tree/browse_frm/month/2005-10/eddfd173d91c1475?rnum=51&#38;_done=%2Fgroup%2Fgoogle-talk-open%2Fbrowse_frm%2Fmonth%2F2005-10%3F</p>
<p>http://ursine.ca/Ursine:Jabber</p>
<p>http://support.jabber.com/faqs/clientinfofaq/clientinfo.html</p>
<p>http://mail.jabber.org/pipermail/jdev/2001-August/008062.html</p>
<p>http://jabbercom.sourceforge.net/</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[restart windows]]></title>
<link>http://tuancom.wordpress.com/2006/03/29/restart-windows/</link>
<pubDate>Wed, 29 Mar 2006 03:30:06 +0000</pubDate>
<dc:creator>Dao Anh Tuan</dc:creator>
<guid>http://tuancom.de.wordpress.com/2006/03/29/restart-windows/</guid>
<description><![CDATA[ BOOL    RestartSystem() {    HANDLE hToken;              // handle to process token     TOKEN_PRIVI]]></description>
<content:encoded><![CDATA[<p><font face="courier new"> BOOL    RestartSystem() {    HANDLE hToken;              // handle to process token     TOKEN_PRIVILEGES tkp;       // pointer to token structure       BOOL fResult;               // system shutdown flag       // Get the current process token handle so we can get shutdown     // privilege.       if (!OpenProcessToken(GetCurrentProcess(),          TOKEN_ADJUST_PRIVILEGES &#124; TOKEN_QUERY, &#38;hToken))        return FALSE;       // Get the LUID for shutdown privilege.    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,          &#38;tkp.Privileges[0].Luid);       tkp.PrivilegeCount = 1;  // one privilege to set        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;       // Get shutdown privilege for this process.    AdjustTokenPrivileges(hToken, FALSE, &#38;tkp, 0,        (PTOKEN_PRIVILEGES) NULL, 0);       // Cannot test the return value of AdjustTokenPrivileges.    if (GetLastError() != ERROR_SUCCESS)        return FALSE;       // Display the shutdown dialog box and start the countdown.    fResult = InitiateSystemShutdown(        NULL,    // shut down local computer        _T(&#34;Are you sure to Restart Windows ?&#34;),   // message for user       0,      // time-out period        TRUE,    // ask user to close apps        TRUE);   // reboot after shutdown       if (!fResult)        return FALSE;       // Disable shutdown privilege.    tkp.Privileges[0].Attributes = 0;     AdjustTokenPrivileges(hToken, FALSE, &#38;tkp, 0,          (PTOKEN_PRIVILEGES) NULL, 0);       return TRUE; } </font></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Anh hùng không chết vì gươm đao]]></title>
<link>http://tuancom.wordpress.com/2006/03/22/anh-hung-khong-ch%e1%ba%bft-vi-g%c6%b0%c6%a1m-dao/</link>
<pubDate>Wed, 22 Mar 2006 05:58:25 +0000</pubDate>
<dc:creator>Dao Anh Tuan</dc:creator>
<guid>http://tuancom.de.wordpress.com/2006/03/22/anh-hung-khong-ch%e1%ba%bft-vi-g%c6%b0%c6%a1m-dao/</guid>
<description><![CDATA[Anh hùng không chết vì gươm đao mà chết vì bệnh … tiêu chảy.
Hồi học phổ th]]></description>
<content:encoded><![CDATA[<blockquote><p>Anh hùng không chết vì gươm đao mà chết vì bệnh … tiêu chảy.</p></blockquote>
<p>Hồi học phổ thông, một thầy dạy lịch sử hay nói với bọn tôi như vậy. Hôm nọ xem TV, nghe bảo bọn ăn cướp/giết người học được rất nhiều mánh khóe của cảnh sát trên các phim truyền hình về điều tra hình sự (như <a href="http://www.cbs.com/primetime/csi/" target="_blank"><font color="#003399">CSI</font></a>), cho nên chúng biết cách xóa dấu vết DNA bằng <a href="http://en.wikipedia.org/wiki/Bleach" target="_blank"><font color="#003399">bleach</font></a>, biết cách dọn dẹp tóc tai, dấu tay, … sau khi phạm pháp. Một anh chàng tội phạm xóa dấu vết rất sạch, nhưng sau đó bị bắt vì … dùng credit card của nạn nhân <img alt="-)" /> .</p>
<p>Nhiều system administrators yêu cầu users đổi password hàng tháng, chạy chương trình kiểm tra tính dễ đoán của password, vân vân, để rồi thấy users ghi luôn password vào một mảnh giấy be bé dán lên … màn hình máy tính. Thậm chí chính bọn sys admins <a href="http://www.out-law.com/page-5790" target="_blank"><font color="#003399">cũng làm thế</font></a>, vì secured passwords khó nhớ quá. Người dùng có khi còn <a href="http://www.theregister.co.uk/2003/04/18/office_workers_give_away_passwords/" target="_blank"><font color="#003399">đổi passwords lấy vài cây bút rẻ tiền<!--  D(["mb","</font>--></font></a>.</p>
<p>\nTuần rồi <a><font>bà con xôn xao</font></a> về vụ CitiBank mất dữ liệu của cả mớ khách hàng, làm cho tất cả các transactions dùng số PIN (và thẻ ATM) đều bị cấm. Năm ngoái thì UPS chuyển dữ liệu của \n3.9 triệu khách hàng của CitiBank và UPS <a><font>làm mất giữa đường</font></a> (mớ dữ liệu này thì lại không mã hóa). Bọn nhà băng nghiên cứu rất kinh về việc áp dụng các phương thức bảo mật tối tân cho các transactions trên Net, để rồi mất một vài cái đĩa unencrypted.\n</p>
<p>\nChủ nhà sợ trộm vào cửa sổ quá, đầu tư cực nhiều tiền vào hệ thống báo động đặt trên cửa sổ, sau đó … quên khóa cửa chính <img />\n . Các nhà làm bảo mật không thể bỏ qua yếu tố con người trong bảo mật. <a><font>Social</font></a> <a>\n<font>engieering</font></a> vẫn là một trong các phương thức tấn công hệ thống hiệu quả nhất. (Xem thêm quyển <a>\n<font>The Art of Deception: Controlling the Human Element of Security </font></a>.)<br />
\n--~--~---------~--~----~------------~-------~--~----~<br />
\nBạn nhận được bài viết này do bạn là thành viên của nhóm &#34;Blog Khoa Học Máy Tính&#34;.\r<br />
Viết bài mới lên Blog K.H.M.T, xin vui lòng gửi nội dung bài đến: <a>",1]  );    //--&#62; </a>.</p>
<p>Tuần rồi <a href="http://www.informationweek.com/showArticle.jhtml;?articleID=181502068" target="_blank"><font color="#003399">bà con xôn xao</font></a> về vụ CitiBank mất dữ liệu của cả mớ khách hàng, làm cho tất cả các transactions dùng số PIN (và thẻ ATM) đều bị cấm. Năm ngoái thì UPS chuyển dữ liệu của 3.9 triệu khách hàng của CitiBank và UPS <a href="http://www.informationweek.com/showArticle.jhtml?articleID=164302314" target="_blank"><font color="#003399">làm mất giữa đường</font></a> (mớ dữ liệu này thì lại không mã hóa). Bọn nhà băng nghiên cứu rất kinh về việc áp dụng các phương thức bảo mật tối tân cho các transactions trên Net, để rồi mất một vài cái đĩa unencrypted.</p>
<p>Chủ nhà sợ trộm vào cửa sổ quá, đầu tư cực nhiều tiền vào hệ thống báo động đặt trên cửa sổ, sau đó … quên khóa cửa chính <img alt="-)" /> . Các nhà làm bảo mật không thể bỏ qua yếu tố con người trong bảo mật. <a href="http://www.astalavista.com/index.php?section=directory&#38;cmd=detail&#38;id=3487" target="_blank"><font color="#003399">Social</font></a> <a href="http://www.astalavista.com/index.php?section=directory&#38;cmd=detail&#38;id=3488" target="_blank"><font color="#003399">engieering</font></a> vẫn là một trong các phương thức tấn công hệ thống hiệu quả nhất. (Xem thêm quyển <a href="http://www.amazon.com/gp/product/0471237124/104-8260996-7342335?v=glance&#38;n=283155" target="_blank"><font color="#003399">The Art of Deception: Controlling the Human Element of Security </font></a>.)</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Web 2.0 không chỉ là công nghệ ]]></title>
<link>http://tuancom.wordpress.com/2006/03/03/web-20-khong-ch%e1%bb%89-la-cong-ngh%e1%bb%87/</link>
<pubDate>Fri, 03 Mar 2006 09:50:24 +0000</pubDate>
<dc:creator>Dao Anh Tuan</dc:creator>
<guid>http://tuancom.de.wordpress.com/2006/03/03/web-20-khong-ch%e1%bb%89-la-cong-ngh%e1%bb%87/</guid>
<description><![CDATA[Được xem là một cuộc cách mạng trên thế giới mạng, thế hệ web mới có nhữ]]></description>
<content:encoded><![CDATA[<p align="justify"><font face="Arial" size="2">Được xem là một cuộc cách mạng trên thế giới mạng, thế hệ web mới có những thay đổi quan trọng không chỉ ở nền tảng công nghệ mà còn cả ở cách thức sử dụng - hình thành nên môi trường cộng đồng, ở đó mọi người cùng tham gia đóng góp cho xã hội "ảo" chứ không chỉ "duyệt và xem".</p>
<p>Web 2.0 là gì? Làm sao phân biệt đâu là Web 1.0 đâu là Web 2.0? Thuật ngữ "Web 2.0" đang trở nên thịnh hành và có phần được lăng xê quá mức. Thực chất, Web 2.0 có nghĩa là sử dụng web đúng với bản chất và khả năng của nó!</p>
<p>Mục tiêu đầu tiên của những người tiên phong xây dựng Internet là nhằm kết nối các nhà nghiên cứu và các máy tính của họ với nhau để có thể chia sẻ thông tin hiệu quả. Khi bổ sung World Wide Web (năm 1990), Tim Berners-Lee cũng nhằm mục tiêu tạo phương tiện cho phép người dùng tự do đưa thông tin lên Internet và dễ dàng chia sẻ với mọi người (trình duyệt web đầu tiên do Berners-Lee viết bao gồm cả công cụ soạn thảo trang web). Tuy nhiên, sau đó web đã phát triển theo hướng hơi khác mục tiêu ban đầu.</p>
<p>Tuy có một số ngoại lệ nhưng thế giới Web 1.0 (thế hệ web trước Web 2.0) chủ yếu gồm các website "đóng" của các hãng thông tấn hay các công ty nhằm mục đích tiếp cận độc giả hay khách hàng hiệu quả hơn. Nó là phương tiện phát tin hơn là phương tiện chia sẻ thông tin. Chỉ đến gần đây, với sự xuất hiện của nhiều kỹ thuật mới như blog (hay weblog), wiki... web mới trở nên có tính cộng đồng (và cộng tác) hơn và trở nên gần hơn với sự kỳ vọng và khả năng thực sự của nó.</p>
<p><strong><font color="#0060bf">KHÁI NIỆM</font><br />
</strong><br />
Khái niệm Web 2.0 đầu tiên được Dale Dougherty, phó chủ tịch của OReilly Media, đưa ra tại hội thảo Web 2.0 lần thứ nhất do OReilly Media và MediaLive International tổ chức vào tháng 10/2004. Dougherty không đưa ra định nghĩa mà chỉ dùng các ví dụ so sánh phân biệt Web 1.0 và Web 2.0: "DoubleClick là Web 1.0; Google AdSense là Web 2.0. Ofoto là Web 1.0; Flickr là Web 2.0. Britannica Online là Web 1.0; Wikipedia là Web 2.0. v.v...". Sau đó Tim OReilly, chủ tịch kiêm giám đốc điều hành OReilly Media, đã đúc kết lại 7 đặc tính của Web 2.0:</p>
<p>1. Web có vai trò nền tảng, có thể chạy mọi ứng dụng</p>
<p>2. Tập hợp trí tuệ cộng đồng</p>
<p>3. Dữ liệu có vai trò then chốt</p>
<p>5. Phần mềm được cung cấp ở dạng dịch vụ web và được cập nhật không ngừng</p>
<p>4. Phát triển ứng dụng dễ dàng và nhanh chóng</p>
<p>6. Phần mềm có thể chạy trên nhiều thiết bị</p>
<p>7. Giao diện ứng dụng phong phú</p>
<p>Thoạt đầu, Web 2.0 được chú trọng tới yếu tố công nghệ, nhấn mạnh tới vai trò nền tảng ứng dụng. Nhưng đến hội thảo Web 2.0 lần 2 tổ chức vào tháng 10/2005, Web 2.0 được nhấn mạnh đến tính chất sâu xa hơn – yếu tố cộng đồng.</p>
<p><strong><font color="#0060bf">CÔNG NGHỆ</font><br />
</strong><br />
Thực tế, ứng dụng trên web là thành phần rất quan trọng của Web 2.0. Hàng loạt công nghệ mới được phát triển nhằm làm cho ứng dụng trên web "mạnh" hơn, nhanh hơn và dễ sử dụng hơn, được xem là nền tảng của Web 2.0.</p>
<p>Kiến trúc công nghệ của Web 2.0 hiện vẫn đang phát triển nhưng cơ bản bao gồm: phần mềm máy chủ, cơ chế cung cấp nội dung, giao thức truyền thông, trình duyệt và ứng dụng.</p>
<p><strong><font color="#0060bf">Cung cấp nội dung</font><br />
</strong><br />
Bước phát triển đầu tiên và quan trọng nhất hướng đến Web 2.0 đó là cơ chế cung cấp nội dung, sử dụng các giao thức chuẩn hoá để cho phép người dùng sử dụng thông tin theo cách của mình (nghĩa là có khả năng tùy biến thông tin). Có nhiều giao thức được phát triển để cung cấp nội dung như RSS, RDF và Atom, tất cả đều dựa trên XML. Ngoài ra còn có các giao thức đặc biệt như FOAF và XFN dùng để mở rộng tính năng của website hay cho phép người dùng tương tác.</p>
<p><strong><font color="#0060bf">Dịch vụ web</font><br />
</strong><br />
Các giao thức truyền thông 2 chiều là một trong những thành phần then chốt của kiến trúc Web 2.0. Có hai loại giao thức chính là REST và SOAP. REST (Representation State Transfer) là dạng yêu cầu dịch vụ web mà máy khách truyền đi trạng thái của tất cả giao dịch; còn SOAP (Simple Object Access Protocol) thì phụ thuộc máy chủ trong việc duy trì thông tin trạng thái. Với cả hai loại, dịch vụ web đều được gọi qua API. Ngôn ngữ chung của dịch vụ web là XML, nhưng có thể có ngoại lệ.</p>
<p>Một ví dụ điển hình của giao thức truyền thông thế hệ mới là Object Properties Broadcasting Protocol do Chris Dockree phát triển. Giao thức này cho phép các đối tượng ảo (tồn tại trên web) tự biết chúng "là gì và có thể làm gì”, nhờ vậy có thể tự liên lạc với nhau khi cần.</p>
<p><strong><font color="#0060bf">Phần mềm máy chủ</font><br />
</strong><br />
Web 2.0 được xây dựng trên kiến trúc web thế hệ trước nhưng chú trọng hơn đến phần mềm làm việc ở "hậu trường". Cơ chế cung cấp nội dung chỉ khác phương thức cấp phát nội dung động (của Web 1.0) về danh nghĩa, tuy nhiên dịch vụ web yêu cầu tiến trình làm việc và dữ liệu chặt chẽ hơn.</p>
<p>Các giải pháp phát triển theo hướng Web 2.0 hiện nay có thể phân làm 2 loại: hoặc xây dựng hầu hết tính năng trên một nền tảng máy chủ duy nhất; hoặc xây dựng ứng dụng "gắn thêm" cho máy chủ web, có sử dụng giao tiếp API.</p>
<p><strong><font color="#0060bf">CỘNG ĐỒNG</font><br />
</strong><br />
Công nghệ chỉ là "bề nổi" của Web 2.0, chính cộng đồng người dùng mới là yếu tố nền tảng tạo nên thế hệ web mới. Việc chuyển từ "duyệt và xem" sang "tham gia" là cuộc cách mạng thực sự, dĩ nhiên nhờ có sự phát triển công nghệ giúp hiện thực khả năng này nhưng ở đây muốn nhấn mạnh đến hành vi của người dùng đối với web.</p>
<p>Hiện trạng phổ biến của các website thế hệ 1.0 đó là chứa nhiều thứ phiền toái và làm việc chậm chạp, dường như luôn muốn gửi đến người dùng thông điệp: đây là website của chúng tôi chứ không phải của bạn. Căn nguyên của vấn đề có thể là do chủ sở hữu các website cảm thấy họ "cho không" cái gì đó. Đôi khi chủ sở hữu website cho rằng càng làm khó người dùng thì họ càng được lợi! Điển hình như một số site cho bạn đọc đoạn đầu của bài viết rồi yêu cầu bạn phải đăng ký (có phí hay không) để đọc nốt phần còn lại.</font></p>
<table cellpadding="0" width="286" align="right" border="0">
<tr>
<td rowspan="2"> </td>
<td bgcolor="#006666"> </td>
<td bgcolor="#006666">
<p align="justify"><font face="Arial" color="#ffffff" size="2">NHỮNG VẤN ĐỀ CỦA WEB 2.0</font></p>
</td>
<td bgcolor="#006666"> </td>
</tr>
<tr>
<td bgcolor="#c9e7e6"> </td>
<td bgcolor="#c9e7e6">
<p align="justify"><font face="Arial"><strong>• Quá kỳ vọng:</strong> Nhiều người cho rằng Web 2.0 sẽ đặt dấu chấm hết cho ứng dụng cài đặt trên máy tính (ứng dụng desktop) và là giải pháp cho mọi vấn đề trong lĩnh vực phần mềm. Các ứng dụng Web 2.0 yêu cầu kết nối Internet ổn định và nhanh để làm việc. Trừ khi kết nối băng rộng được phủ khắp, còn không thì Web 2.0 chỉ là một bổ sung cho cách thức chúng ta làm việc (bên cạnh ứng dụng desktop).<br />
<strong>• Quá đơn giản:</strong> Web 2.0=Ajax! Cũng như Web 2.0, Ajax được kỳ vọng quá nhiều, thậm chí nhiều người còn đánh đồng Ajax với Web 2.0. Thực chất, Ajax chỉ là một trong số nhiều công nghệ nền tảng của Web 2.0 và Ajax còn có những hạn chế.<br />
<strong>• Quá chú trọng công nghệ:</strong> RSS, SOA, Ajax... hàng loạt công nghệ nổi đình nổi đám gần đây được gắn liền với Web 2.0. Người ta hăm hở áp dụng các công nghệ mới mà không quan tâm đến các tính chất quan trọng hơn: truyền thông, cộng tác, trí tuệ cộng đồng. </font></p>
</td>
<td bgcolor="#c9e7e6"> </td>
</tr>
</table>
<p align="justify"><font face="Arial" size="2">Dĩ nhiên, với sự phổ biến của các phần mềm máy chủ, trong đó có cả phần mềm miễn phí như Apache thì người dùng có thể đưa lên web bất kỳ thông tin gì. Tuy nhiên có nhiều yếu tố cản trở: kỹ năng tạo website, hạn chế của nhà cung cấp dịch vụ Internet, việc bảo mật và kiểm duyệt...</p>
<p>Về cơ bản, Web 2.0 trao quyền nhiều hơn cho người dùng và tạo nên môi trường liên kết chặt chẽ các cá nhân với nhau. Giờ đây có nhiều ví dụ cho thấy cộng đồng người dùng có thể đóng góp thông tin giá trị khi họ có phương tiện thích hợp. Wikipedia có lẽ là ví dụ nổi tiếng nhất. Tuy có nhiều học giả không đánh giá cao Wikipedia, nhưng họ quên một điều quan trọng: nó đủ tốt, miễn phí và nhiều người có thể đọc. Ngoài ra còn có những ví dụ khác như các site Reddit và Digg để cho người dùng quyết định thông tin gì là quan trọng, hay del.icio.us cho phép mọi người chia sẻ những địa chỉ web hay.</p>
<p>Web 2.0 cho phép mọi người có thể đưa lên mạng bất cứ thông tin gì. Với số lượng người tham gia rất lớn, đến mức độ nào đó, qua quá trình sàng lọc, thông tin sẽ trở nên vô cùng giá trị. Ở đây có sự tương đồng với thuyết chọn lọc tự nhiên.</p>
<p><strong><font color="#0060bf">KẾT LUẬN</font><br />
</strong><br />
Thật sự, Web 2.0 không phải là cái gì đó hoàn toàn mới mà là sự phát triển từ web hiện tại. Nó vẫn là web như chúng ta dùng lâu nay, chỉ có điều giờ đây chúng ta làm việc với web theo cách khác. Các website không còn là những "ốc đảo" mà trở thành những nguồn thông tin và chức năng, hình thành nên môi trường điện toán phục vụ các ứng dụng web và người dùng.</p>
<p>Không phải là viễn cảnh, Web 2.0 đã hiện hữu quanh chúng ta với hàng loạt website thế hệ mới. Xu hướng chuyển đổi sang Web 2.0 đang diễn ra mạnh mẽ và là xu thế tất yếu.<br />
<img src="http://www.pcworld.com.vn/pcworld/info/misc/2006/2/A0602_CN_84.gif" /></font>
</p>
<p align="justify"> </p>
<p><font face="Arial" size="2"><strong>Theo pcworld.com.vn</strong><br />
<strong>Tham khảo:</strong><br />
• What is Web 2.0, OReilly<br />
• Web 2.0, Wikipedia<br />
• Web 2.0 Blog, web2.wsj.com </font></p>
]]></content:encoded>
</item>

</channel>
</rss>
