<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Jon Galloway : //TODONT:</title><link>http://weblogs.asp.net/jgalloway/archive/tags/_2F002F00_TODONT_3A00_/default.aspx</link><description>Tags: //TODONT:</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>//TODONT: Use a Windows Service just to run a scheduled process</title><link>http://weblogs.asp.net/jgalloway/archive/2005/10/24/428303.aspx</link><pubDate>Mon, 24 Oct 2005 22:42:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:428303</guid><dc:creator>Jon Galloway</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jgalloway/rsscomments.aspx?PostID=428303</wfw:commentRss><comments>http://weblogs.asp.net/jgalloway/archive/2005/10/24/428303.aspx#comments</comments><description>&lt;p&gt;A common requirement in business application is a scheduled process - call a webservice, process the data, and FTP the results to a business partner, for instance. Developers kick around possible solutions - BizTalk's overkill, DTS won't handle it well, what to do?&lt;/p&gt; &lt;p&gt;Invariably, someone suggests a Windows Service with a timer. Just as invariably, when you try to talk them out of it, they'll condescendingly tell you that Windows Services are easy to write in .NET. "Trust me, it's not hard - we'll write a simple service with a timer which will do a simple time check..."&lt;/p&gt; &lt;p&gt;&lt;strong&gt;A Windows Service&amp;nbsp;is the wrong solution to scheduling one-off custom processes. The right solution for scheduling simple processes is the Windows Task Scheduler.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Let's look at what Windows Services are designed for. From the Windows Help documentation:&lt;/p&gt; &lt;div style="border: 1px solid black; padding: 5px; background-color: gainsboro;"&gt;&lt;div&gt;&lt;b&gt;Service&lt;/b&gt;&lt;/div&gt; &lt;span style="font-size: 10pt; color: rgb(0, 0, 0); font-family: Courier New;"&gt;A program, routine, or process that performs a specific system function to support other programs, particularly at a low (close to the hardware) level. When services are provided over a network, they can be published in Active Directory, facilitating service-centric administration and usage. Some examples of services are the Security Accounts Manager service, File Replication service, and Routing and Remote Access service.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt; &lt;p&gt; Web servers qualify as services, databases qualify as services, and the above Windows system features qualify as services. The Task Scheduler qualifies as a service. Possibly,&amp;nbsp;custom server applications may qualify as a service if it needs to run round the clock &lt;em&gt;and&lt;/em&gt; is written with the greatest sobriety, responsibility, and respect. Your&amp;nbsp;scheduled file FTP doesn't qualify as a service. &lt;/p&gt; &lt;p&gt;A Windows Service which runs a timer needs to run Automatically, which means it will start up before you can log onto the machine and churn away until the machine is shut down. If they hang or have a slow memory leak, they'll continue to be a drag on the system until the service is restarted (or they crash the machine). I can't tell how many times I've heard the following in production meetings: "The cause of the outage was the WhamoInhouse Service. The resolution was to restart the service." Or, worse, application servers need to be restarted regularly because they're hosting&amp;nbsp;poorly written&amp;nbsp;services, but the IT shop blames the operating system.&lt;/p&gt; &lt;p&gt;Windows Services &lt;em&gt;do&lt;/em&gt; offer sophisticated Recovery actions (on first, second, and subsequent failures you can specify that a program to be executed, or that the service or computer be restarted), but they're geared towards hard failures of the executable rather than business process failures, and they don't respond to things like memory leaks or hanging network connections. They offer absolutely no scheduling, because services are designed to run all the time. On the other hand, Windows Scheduled Tasks have advanced scheduling features which can be&amp;nbsp;accessed administratively. If the business requirements for my scheduled FTP task change two years down the road so the FTP should happen twice a day every Monday, Wednesday, and Friday, the change can be made by an administrator.&amp;nbsp;The&amp;nbsp;task schedule has been tested across leap years, daylight savings time, and clock changes; most custom timer routines I've seen haven't.&lt;/p&gt; &lt;p&gt;Scheduled console applications are easier to design, build, test, deploy, and install&amp;nbsp;- especially compared to a professional service which can run reliably for weeks end. This wouldn't by itself be a compelling argument if&amp;nbsp;a Windows Service&amp;nbsp;were the right solution by other criteria, but since it's not, this is another nail in the coffin. Consider, then, that your extra time spent building a service is wasted development time. Maybe fun "I am a bigtime coder now" development time, but not of any business value.&lt;/p&gt; &lt;p&gt;Scheduled console applications are easier to run in an ad hoc manner when necessary.&amp;nbsp;Let's say the webservice vendor calls three hours after our process ran to inform us that he had a data corruption problem which has been corrected and we should re-run our process. In the case of a Windows Service with a timer, we'd be scratching our heads; with our console application we can run it manually whenever we want.&lt;/p&gt; &lt;p&gt; Finally, running separate Windows Services with their own timers is just plain inefficient with server resources. Ignore for the second the fact that we're hogging CPU and memory space 24/7 for a process that runs occasionally; multiple independant timers which check the time every few seconds is dumb.&lt;/p&gt; &lt;p&gt;If I kept writing Windows Services with timers, eventually I'd start to think about writing a single host system with a timer. Then I'd want to add in some more advanced scheduling features; perhaps even some logging. Eventually, I'd have a Windows Service that handles scheduling of child processes, and if I devoted years to enhancements and testing, I'd eventually arrive at... the Windows Task Scheduler.&lt;/p&gt; &lt;p&gt;If you're writing a Windows Service that runs a timer, you should re-evaluate your solution.&lt;/p&gt; &lt;!-- Powered by IMHO 1.3 (EN) Instant Blogger Copyright (c) 2005 A.Boschin - http://www.imhoproject.org --&gt; &lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=428303" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jgalloway/archive/tags/_2F002F00_TODONT_3A00_/default.aspx">//TODONT:</category><category domain="http://weblogs.asp.net/jgalloway/archive/tags/.NET+code/default.aspx">.NET code</category></item><item><title>isIE=document.all; //only kind of true</title><link>http://weblogs.asp.net/jgalloway/archive/2005/08/07/421798.aspx</link><pubDate>Sun, 07 Aug 2005 12:23:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:421798</guid><dc:creator>Jon Galloway</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jgalloway/rsscomments.aspx?PostID=421798</wfw:commentRss><comments>http://weblogs.asp.net/jgalloway/archive/2005/08/07/421798.aspx#comments</comments><description>&lt;font face="Verdana" size="2"&gt; &lt;/font&gt;&lt;p&gt;&lt;font face="Verdana" size="2"&gt;Internet Explorer&amp;nbsp;4 used &lt;strong&gt;document.all['elementName']&lt;/strong&gt; to refer to document elements while waiting for the W3C standard, which turned out to be&amp;nbsp;&lt;strong&gt;document.getElementById('elementName')&lt;/strong&gt;. IE 5 and above, plus all other modern standards based browsers, all support &lt;strong&gt;document.getElementByID()&lt;/strong&gt;. &lt;a style="border-bottom-style: groove;" href="http://www.w3schools.com/browsers/browsers_stats.asp"&gt;IE 4 usage was below .5% in 2002&lt;/a&gt; and isn't even being tracked anymore, so there's no good reason to be using &lt;strong&gt;document.all&lt;/strong&gt; anymore.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;Firefox developers decided to partially support this non-standard syntax since so many pages are still using it. It was probably a good decision - if they didn't, people would decide that Firefox was no good since it couldn't run their favorite pages, even though real problem was buggy webpages.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;On the other hand, they didn't want to encourage use of non-standards compliant&amp;nbsp;code, and they certainly didn't want to break all those poorly written scripts that (incorrectly) assumed the following:&lt;br /&gt;&lt;strong&gt;isIE=document.all;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;&lt;a href="http://mozillanews.org/?article_date=2004-07-23+18-06-59"&gt;So Firefox supports document.all, but says it doesn't&lt;/a&gt;. That means it can evaluate &lt;strong&gt;document.all['elementName']&lt;/strong&gt;, but &lt;strong&gt;alert(document.all)&lt;/strong&gt;&amp;nbsp;shows false.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;This behavior makes some sense, but can result in some weird behavior. Scripts that were written for IE only (using &lt;strong&gt;document.all[]&lt;/strong&gt; syntax) will work in Firefox, but scripts which test for IE with &lt;strong&gt;document.all&lt;/strong&gt; but don't include proper handling for non-IE browsers don't work.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;There are some much better solutions to the document.all mess:&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;1. Obviously, the best is to convert from &lt;strong&gt;document.all[]&lt;/strong&gt; to &lt;strong&gt;document.getElementById()&lt;/strong&gt;. It's standards compliant, works in 99+% of browsers, has a great beat, and is easy to dance to. Usually it's a simple find / replace exercise. However, it's sometimes not practical when you've got legacy scripts or browsers to deal with.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;2. If you have to support IE 4 &lt;a href="http://www.metalusions.com/backstage/articles/8/"&gt;David Emmerson&lt;/a&gt; came up with a great work-around: add &lt;strong&gt;document.getElementById&lt;/strong&gt; support to IE4 with this little script:&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;&lt;strong&gt;if(document.all &amp;amp;&amp;amp; !document.getElementById) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; document.getElementById = function(id) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return document.all[id];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;3. If you absolutely&amp;nbsp;have to write browser dependant code, use a decent browser detection script. This one is pretty solid: &lt;a href="http://webreference.com/tools/browser/javascript.html"&gt;http://webreference.com/tools/browser/javascript.html&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;The best general approach is to check for support of a feature rather than to sniff IE and apply IE / non-IE logic. If you &lt;em&gt;need&lt;/em&gt; to determine if you're looking at IE, you can just ask nicely (does navigator.appName = 'MSIE'?).&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;Of course, cross browser Javascript is a complex subject. Here are some good references:&lt;br /&gt;&lt;a href="http://www.stopbadtherapy.com/standards.shtml"&gt;http://www.stopbadtherapy.com/standards.shtml&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www-128.ibm.com/developerworks/web/library/wa-ie2mozgd/"&gt;http://www-128.ibm.com/developerworks/web/library/wa-ie2mozgd/&lt;/a&gt; &lt;/font&gt; &lt;font face="Verdana" size="2"&gt;&lt;a href="http://imhoproject.org/"&gt;&lt;font color="#f3f3f3" face="Verdana" size="1"&gt;powered by IMHO 1.2&lt;/font&gt;&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;!-- Powered by IMHO Instant Blogger Copyright (c) 2004 A.Boschin - http://www.elite.boschin.it --&gt; &lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=421798" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jgalloway/archive/tags/_2F002F00_TODONT_3A00_/default.aspx">//TODONT:</category><category domain="http://weblogs.asp.net/jgalloway/archive/tags/Browsers+_2F00_+Web+Development/default.aspx">Browsers / Web Development</category></item><item><title>Joel got it wrong - Why learning C is a waste of your college time and money</title><link>http://weblogs.asp.net/jgalloway/archive/2005/02/16/374212.aspx</link><pubDate>Wed, 16 Feb 2005 15:47:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:374212</guid><dc:creator>Jon Galloway</dc:creator><slash:comments>30</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jgalloway/rsscomments.aspx?PostID=374212</wfw:commentRss><comments>http://weblogs.asp.net/jgalloway/archive/2005/02/16/374212.aspx#comments</comments><description>&lt;p&gt; Back in January,&amp;nbsp;Joel Spoelsky wrote a&amp;nbsp; &lt;a href="http://www.joelonsoftware.com/items/2005/01/02.html"&gt; Career Advice&lt;/a&gt; column. It&amp;nbsp;gave some generally good advice to college students, the main points being:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Learn how to write before graduating.&lt;/li&gt;&lt;li&gt;&lt;font color="red"&gt;&lt;strong&gt;Learn C before graduating.&lt;/strong&gt; &lt;/font&gt; &lt;/li&gt;&lt;li&gt;Learn microeconomics before graduating.&lt;/li&gt;&lt;li&gt;Don't blow off non-CS classes just because they're boring.&lt;/li&gt;&lt;li&gt;Take programming-intensive courses.&lt;/li&gt;&lt;li&gt;Stop worrying about all the jobs going to India.&lt;/li&gt;&lt;li&gt;No matter what you do, get a good summer internship.&lt;/li&gt;&lt;/ol&gt; &lt;font face="Verdana" size="2"&gt; &lt;/font&gt;&lt;p&gt;&lt;b&gt;[update: note that Joel's advice is to college students in general, not just to computer science majors]&lt;/b&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;I agreed with everything but (2). I believe learning C before graduating may help some, but hurt just as many. While it might have helped Joel, I don't think it's universally good advice. It's been bugging me for a month now, so it's time to get it in writing. In the interest of hopefully getting comments from someone other than my pals at &lt;a href="http://www.online-cheap-meds-4u.ru"&gt;www.online-cheap-meds-4u.ru&lt;/a&gt; and &lt;a href="http://www.poker-gambling-casino.net"&gt;www.poker-gambling-casino.net&lt;/a&gt; , I aim for the nearest windmill and present:&lt;/font&gt;&lt;/p&gt; &lt;font face="Verdana" size="2"&gt; &lt;/font&gt;&lt;p&gt;&lt;font face="Verdana" size="2"&gt;Jon's 6 reasons why learing C is a waste of your college time and money:&lt;/font&gt;&lt;/p&gt;&lt;font face="Verdana" size="2"&gt; &lt;/font&gt;&lt;ol&gt;&lt;font face="Verdana" size="2"&gt; &lt;li&gt;It's not a skill you'll use in most of the software development jobs you'd want to have&lt;/li&gt;&lt;li&gt;It can give you a false sense of control &lt;/li&gt;&lt;li&gt;It can teach you to get in the way &lt;/li&gt;&lt;li&gt; It can make it hard for you to love famework based development &lt;/li&gt;&lt;li&gt;It can teach you philosophies which will prevent you from really understanding modern programming &lt;/li&gt;&lt;li&gt;It can teach you divert your problems from the real challenges of software engineering &lt;/li&gt;&lt;/font&gt;&lt;/ol&gt;&lt;font face="Verdana" size="2"&gt; &lt;/font&gt;&lt;p&gt; &lt;font face="Verdana" size="2"&gt; &lt;/font&gt;&lt;/p&gt;&lt;h3&gt;&lt;font face="Verdana" size="2"&gt;1. It's not a skill you'll use in most of the software development jobs you'd want to have&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;&lt;/p&gt;&lt;font face="Verdana" size="2"&gt; &lt;/font&gt;&lt;p&gt;&lt;font face="Verdana" size="2"&gt;Without trying to offend anyone who's into this kind of stuff (weirdos!), here are the kind of things you might use C for these days - writing some kind of device driver, maintaining&amp;nbsp;extremely old applications, embeded development on very limited hardware, or maybe writing an operating system or compiler or something. I guess you could like hack away on the Linux (or is that GNU-Linux) kernel.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;Hey, if that sounds fun then off to the races. Consider this though - you're not really going to be solving any new problems. If you want to do web development, database development, desktop applications - you know, stuff you can talk about at a party - you're probably not going to be working in C.&lt;/font&gt;&lt;/p&gt;&lt;font face="Verdana" size="2"&gt; &lt;/font&gt;&lt;p&gt;&lt;/p&gt;&lt;h3&gt;&lt;font face="Verdana" size="2"&gt;2. It can give you a false sense of control&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;Quote from Joel's article:&lt;/font&gt;&lt;/p&gt;&lt;font face="Verdana" size="2"&gt; &lt;/font&gt;&lt;blockquote&gt;&lt;font face="Verdana" size="2"&gt; &lt;/font&gt;&lt;p&gt;&lt;font face="Verdana" size="2"&gt;&lt;em&gt;I don't care how much you know about continuations and closures and exception handling: if you can't explain why &lt;strong&gt;while (*s++ = *t++);&lt;/strong&gt; copies a string, or if that isn't the most natural thing in the world to you, well, you're programming based on superstition, as far as I'm concerned: a medical doctor who doesn't know basic anatomy, passing out prescriptions based on what the pharma sales babe said would work.&lt;/em&gt; &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;font face="Verdana" size="2"&gt; &lt;/font&gt;&lt;p&gt;&lt;font face="Verdana" size="2"&gt;That sounds good on the surface, but does his code sample really tell you how the string is being copied? It's a symbolic representation of a process which is moving memory, sure, but still several levels of abstraction away from shuttling the bits through memory. Why is this the magic level of abstraction that gives you the edge? Why not assembler?&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;Worse still is that it can make you think that programming is about telling the computer what to do with its registers and memory. Oops, wait, that memory was magically paged from disk without your knowlege. The compiler applied some optimizations behind your back. Your code is running on top of an operating system, which is&amp;nbsp;rationing out the CPU cycles between tens of processes, and yours gets a measly 10% timeslice. And, hey, what CPU are you on? Any sneaky little tricks going on with your 64 bit hyperthreaded chip? What about two years from now, when you run your app on a virtual server on a multicore chip?&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;Thinking that you're in the pilot's seat because you're handling pointers is silly. Better to understand that you're asking the CPU(s), through multiple levels of abstraction, to copy a string. Do it politely - this ain't no rowboat anymore, it's a durned space ship.&lt;/font&gt;&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;h3&gt;&lt;font face="Verdana" size="2"&gt;3. It can teach you to get in the way&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt; That false sense of control I mentioned before can lead to outsmarting yourself. Some examples:&lt;/font&gt;&lt;/p&gt; &lt;ul&gt; &lt;font face="Verdana" size="2"&gt; &lt;li&gt;Trying to pool database connections or &lt;a title="" href="http://codebetter.com/blogs/sahil.malik/archive/2005/01/30/48948.aspx" target="" name=""&gt;holding a global connection&lt;/a&gt;, not knowing that the data layer is automatically pooling if you let it &lt;/li&gt;&lt;li&gt;Overriding the .NET Garbage Collector, assuming that Java / Micro$oft doesn't know how to manage memory nearly as well as you can&lt;/li&gt;&lt;/font&gt;&lt;/ul&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;In both these cases, a little bit of knowledge is (as rumored) a dangerous thing. If all you learned from C is that you are the boss, you will most certainly write code that plays poorly with others.&lt;/font&gt;&lt;/p&gt; &lt;h3&gt;&lt;font face="Verdana" size="2"&gt;4. It can make it hard for you to love framework based development&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;Moderns programming languages run on top of frameworks. .NET apps use the .NET framework, Java uses J2EE (et. al.), and arguably web apps run on top of a browser / communication communication that constitutes an application framework. The list could go on (GTK, XUL, web service, Flash). Most good frameworks are standards based, and all of them host your solutions so you only solve new problems.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;C code, by and large, is not about frameworks. At its best, it uses some libraries and links to some API's. C gives you a toolset that can solve just about any problem, but requires that you solve each and every problem every time. Frameworks were created to obviate solving the same problems in each program you write. Software development has made a steady progression from &lt;strong&gt;code&lt;/strong&gt; to &lt;strong&gt;libraries&lt;/strong&gt; to &lt;strong&gt;components&lt;/strong&gt; to &lt;strong&gt;frameworks&lt;/strong&gt;. Thankfully, you don't need to retrace this path just as you don't need to experience the dark ages to live in the post-renaissance world.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;To be productive as a programmer these days, you either need to be learning to get the most out of existing frameworks or helping to build tomorrow's frameworks. To learn to be a productive programmer, you need to learn how to work with frameworks. &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;Learning to work with a framework takes work. You need to learn research skills that go far beyond fixing syntax errors. You need to learn how to optimally integrate with our environment, what the environment will provide for you, and&amp;nbsp;what's expected of you.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;Thankfully, learning to work with&amp;nbsp;a framework is a transferable skill, so the exact framework doesn't matter so much as that you learn how to use a framework&amp;nbsp;- pick an environment and get going.&lt;/font&gt;&lt;/p&gt; &lt;h3&gt;&lt;font face="Verdana" size="2"&gt;5. It can teach you philosophies which will prevent you from really understanding modern programming&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;C code is procedural. That means you describe an exact set of steps you want your program to accomplish. If you want to find a value in an array, you write code that loops through each element in the array - a house to house search.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;Modern programming is often declarative, meaning that you describe what you want and&amp;nbsp;thing else decides the best way to get it. Databases, for instance, respond to "Queries" - a request for information in a descriptive language. The database maintains indexes to find the data&amp;nbsp;without looking at every line, and the good databases self-optimize based on the questions they're asked most often. To continue the analogy from before, we replace the house to house search with a 411 call. Cursors in database queries are just about always a failure on the programmer's part to describe the problem rather than limitations of the database engines.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;A surprising amount of work in current software is described rather than prescribed. HTML, for instance is a markup language that describes content and layout to a browser, which does the hard work of wrapping text, applying styles&amp;nbsp;and enforcing&amp;nbsp;user-defined security settings.&amp;nbsp;XPath and regular expressions&amp;nbsp;some&amp;nbsp;more&amp;nbsp;current technologies which implement declarative programming.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;The point here is that modern programming is moving towards Domain Specific Languages (DSL's) which efficiently communicate programmer intent to CPU cycles. C is not a good prototype for any of these DSL's.&lt;/font&gt;&lt;/p&gt; &lt;h3&gt;&lt;font face="Verdana" size="2"&gt;6. It can teach you divert your problems from the real challenges of software engineering&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;There is significant work to be done today in software engineering that requires fresh, energetic minds. Some examples:&lt;/font&gt;&lt;/p&gt; &lt;ul&gt; &lt;font face="Verdana" size="2"&gt; &lt;li&gt;We are on the verge of ubiquitous AI - self organizing systems (software and hardware) that will collaboratively solve problems for us. We're still &lt;a href="http://www.itconversations.com/shows/detail336.html"&gt;figuring out&lt;/a&gt; how to manage them.&lt;/li&gt; &lt;li&gt;We've got a lot of disparate systems that still don't communicate well.&lt;/li&gt; &lt;li&gt;We are being bombarded by more information than we can currently process. Fixing the U.S. intelligence system to the point that pre-9/11 dots could have been connected requires storage and analysis of 36 Terrabytes per week ongoing (quote from recent IT Conversations - Accelerating Change&amp;nbsp;audiocast). RSS and e-mail volume continue to grow.&lt;/li&gt; &lt;li&gt;Computer users need both security and privacy. Neither is relible today.&lt;/li&gt; &lt;li&gt;Our current methodologies routinely result in failed projects. (Examples - recent failed $170B FBI project, Mars mission software errors, etc.)&lt;/li&gt; &lt;li&gt;Bob in accounting needs a report on recent payment orders to office supply companies, but the data is stored in Excel files on Mary's desktop. Mary is on vacation.&lt;/li&gt; &lt;li&gt;Walt in IT just gave two weeks notice. He justtold you that he's been managing several daily FTP&amp;nbsp;transfers of critical company data. He manually inserts into the production database using some scripts his roommate helped him figure out.&lt;/li&gt; &lt;li&gt;Marketing promised product X by June. Management budgeted for product .25X by June 2025. You are the developer for product X.&lt;/li&gt; &lt;li&gt;Etc. &lt;/li&gt;&lt;/font&gt;&lt;/ul&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;The point is, today's software development environment is dynamic, evolving, and extremely challenging. If you're going to be of help, you need to do something more productive with your time than learn a 20 year old language. There's plenty to learn - if you're going to take one computer class, make it HTML, Java, C#, VB, SQL, XML, Javascript... anything but C! I've personally interviewed over 100 people for programming positions. I would personally take skills in any of the above technologies over C in my hiring decisions.&lt;/font&gt;&lt;/p&gt; &lt;h3&gt;&lt;font face="Verdana" size="2"&gt;Epilogue&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;In the movie &lt;a title="" href="http://www.realwomenhavecurves.com/story.html" target="" name=""&gt;Real Women Have Curves&lt;/a&gt;, the main character is a Mexican American girl who's been offered a full scholarship to Columbia. Her mother won't let her accept,&amp;nbsp;giving some bogus&amp;nbsp;reasons about needing to stay near her family. When her father challenges it, she tells him the real reason: she's had to work in a sweatshop her whole life to provide for the family, and there's no way her daughter is going to skate from school to college to the easy life without some time in the sweatshops. It's her turn to work.&lt;/font&gt;&lt;/p&gt;&lt;font face="Verdana" size="2"&gt; &lt;/font&gt;&lt;p&gt;&lt;font face="Verdana" size="2"&gt;When an experienced programmer tells you to learn C nowdays, they're either trying to apply their out of context life experiences to yours, or they're trying to throw you in the sweatshop because that's what they had to do.&lt;/font&gt;&lt;/p&gt;&lt;font face="Verdana" size="2"&gt; &lt;/font&gt;&lt;p&gt;&lt;font face="Verdana" size="2"&gt; There's plenty to learn in computer science circa 2005. Don't waste your time on history unless you want to be a historian.&lt;/font&gt;&lt;/p&gt;&lt;font face="Verdana" size="2"&gt; &lt;/font&gt;&lt;!-- Powered by IMHO Instant Blogger Copyright (c) 2004 A.Boschin - http://www.elite.boschin.it --&gt; &lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=374212" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jgalloway/archive/tags/Software+Development/default.aspx">Software Development</category><category domain="http://weblogs.asp.net/jgalloway/archive/tags/_2F002F00_TODONT_3A00_/default.aspx">//TODONT:</category></item></channel></rss>