<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
		>
<channel>
	<title>Comments on: What Programmers Should Be Learning in College</title>
	<atom:link href="http://improvingsoftware.com/2009/06/03/what-programmers-should-be-learning-in-college/feed/" rel="self" type="application/rss+xml" />
	<link>http://improvingsoftware.com/2009/06/03/what-programmers-should-be-learning-in-college/</link>
	<description>Upgrading the software development process one reader at a time.</description>
	<lastBuildDate>Tue, 01 May 2012 06:08:29 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
	<item>
		<title>By: K</title>
		<link>http://improvingsoftware.com/2009/06/03/what-programmers-should-be-learning-in-college/#comment-232</link>
		<dc:creator><![CDATA[K]]></dc:creator>
		<pubDate>Wed, 01 Jul 2009 18:04:37 +0000</pubDate>
		<guid isPermaLink="false">http://improvingsoftware.com/?p=725#comment-232</guid>
		<description><![CDATA[You can&#039;t be serious.  I&#039;ve liked much of what you&#039;ve written, but this is just bad.
This is a program for teaching people to be drivers when you should be teaching them to be mechanics.  Every mechanic can drive, but not many drivers can even change their own oil.  This teaches how to use other people&#039;s platforms to do basic business software, but it does not teach you how to do any of the hard stuff.  It doesn&#039;t even provide a foundation.

No algorithms, as others have noted above?  No operating system internals?  Nothing about how to implement a database?  No graphics?  No programming language theory, especially compilers?  Your &quot;variety of programming languages&quot; is a joke; it&#039;s all from the menu of the same restaurant.

If you never want to do anything fundamentally hard, if you only want to follow in the path of more knowledgeable pioneers years after they did, then this is the program for you.  But you&#039;ll never do anything new or exciting, and you&#039;ll always be dependent on other people to do the truly hard things.  A world of graduates of programs like this will have no Google, no Tivo, no Lucene, no Amazon, no Linux... Wait, it wouldn&#039;t have anything, because the only things that these graduates would know how to build would depend on pieces that nobody would know how to build.

Actually, wait...  That&#039;s great for me.  I changed my mind.  Every CS program should be shut down and replaced with this &quot;Software Engineering&quot; program.]]></description>
		<content:encoded><![CDATA[<p>You can&#8217;t be serious.  I&#8217;ve liked much of what you&#8217;ve written, but this is just bad.<br />
This is a program for teaching people to be drivers when you should be teaching them to be mechanics.  Every mechanic can drive, but not many drivers can even change their own oil.  This teaches how to use other people&#8217;s platforms to do basic business software, but it does not teach you how to do any of the hard stuff.  It doesn&#8217;t even provide a foundation.</p>
<p>No algorithms, as others have noted above?  No operating system internals?  Nothing about how to implement a database?  No graphics?  No programming language theory, especially compilers?  Your &#8220;variety of programming languages&#8221; is a joke; it&#8217;s all from the menu of the same restaurant.</p>
<p>If you never want to do anything fundamentally hard, if you only want to follow in the path of more knowledgeable pioneers years after they did, then this is the program for you.  But you&#8217;ll never do anything new or exciting, and you&#8217;ll always be dependent on other people to do the truly hard things.  A world of graduates of programs like this will have no Google, no Tivo, no Lucene, no Amazon, no Linux&#8230; Wait, it wouldn&#8217;t have anything, because the only things that these graduates would know how to build would depend on pieces that nobody would know how to build.</p>
<p>Actually, wait&#8230;  That&#8217;s great for me.  I changed my mind.  Every CS program should be shut down and replaced with this &#8220;Software Engineering&#8221; program.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: KL</title>
		<link>http://improvingsoftware.com/2009/06/03/what-programmers-should-be-learning-in-college/#comment-192</link>
		<dc:creator><![CDATA[KL]]></dc:creator>
		<pubDate>Sat, 13 Jun 2009 15:02:42 +0000</pubDate>
		<guid isPermaLink="false">http://improvingsoftware.com/?p=725#comment-192</guid>
		<description><![CDATA[Not a bad start.  (Aside: topics eerily similar to the 7 Habits of Highly Effective People, which is a strictly Modernist approach in a post-modern world, it might not apply too well for the future.)

How about this suggested plan instead?



Freshman Year – The fundamentals

Overview of Operating Systems: Working knowledge and exposure to at least 3 of the most commonly used operating systems, i.e. Windows, Linux, OSX, etc. The ulterior motive is to derail platform bigotry before the mental cement dries.

Overview of Programming Languages: Exposure to a variety of languages by writing very basic programs in each. (Excel VBA, C, C++, Java, C#, Perl, Matlab/Octave).

Scripting 101: Familiarity with the most basic programming concepts such as variables, methods, control structures, etc. without the overhead of more advanced programming concepts to provide a comfortable “wade-in” point for those new to programming.

The Hardware/Software Interface: Digital logic (boolean algebra, logic gates, KV maps, etc...), assembly language

Source Code Control and the Build Process: CVS/SVN/git, committing code, assigning defects/features, creating a backend build process.



Sophomore Year – Filling the toolbox

Data Structures and Algorithms (2-semester interleaved course):  big-O, lists, arrays, hash tables, binary trees, searching, sorting, ...

Programming in [Student’s Choice]: In depth programming course in the language of the student’s choice.

Debugging/Troubleshooting:I am amazed at how impressively bad a lot of working programmers are at this. Suggested Textbook: “Debugging: The 9 Indispensable Rules for Finding Even the Most Elusive Software and Hardware Problems.”

Debottlenecking Code: profiling, optimizing, Static/Dynamic code analysis.  Focus on CPU-bound applications.

Networking Basics: Topics including, networking hardware, topologies, basic signaling, and protocols.



Junior Year – Sharpening the tools

Application Architecture: Become familiar with common application architectures, associated issues, and relevant technologies. (Desktop, Client-Server, N-Tier, Web, Embedded, AJAX, etc.)

CRUD Applications 1:  Microsoft Access, data normalization, SQL, queries, frontend UI, reporting

CRUD Applications 2:  Migrate application developed in CRUD Applications 1 to 3-tier web/app server/SQL server

Programming Technique: OOP, Design Patterns, Refactoring, Coupling Cohesion.

Technical Writing: a general technical writing course from the English department

Software Engineering Ethics:  history of famous software mistakes, IP issues, the conflicts between making money and doing the right thing



Senior Year – From machinist to craftsman

Building A Non-Trivial Application: Each student (individually only) builds anything they want (2D/3D game, business app, ...) using any programming language they wish.  It must exceed 3000 LOC and be reasonably commented.  In the final portion of the course, they must implement a new non-trivial feature in a classmate&#039;s project.

Testing Software: Tools and technique (Unit, Automated, Load, Regression, Integration)

Usability / User Experience: Suggested text – “About Face 2.0: The Essentials of Interaction Design”

Programming for a Diverse world: character sets (ASCII/CP437/Unicode etc.), string replacement (I18N/L10N/BiDi), issues in N-tier architecture

Computer Security: crypto/SSL/PKI, worms/viruses (including writing them), exploits (buffer overflow, SQL injection, etc.)

The Project Lifecycle:  Requirements Gathering, Use Cases, Prototyping, Agile, Waterfall, etc.


----snip----

Very similar to your list, but a few additions and re-groupings.]]></description>
		<content:encoded><![CDATA[<p>Not a bad start.  (Aside: topics eerily similar to the 7 Habits of Highly Effective People, which is a strictly Modernist approach in a post-modern world, it might not apply too well for the future.)</p>
<p>How about this suggested plan instead?</p>
<p>Freshman Year – The fundamentals</p>
<p>Overview of Operating Systems: Working knowledge and exposure to at least 3 of the most commonly used operating systems, i.e. Windows, Linux, OSX, etc. The ulterior motive is to derail platform bigotry before the mental cement dries.</p>
<p>Overview of Programming Languages: Exposure to a variety of languages by writing very basic programs in each. (Excel VBA, C, C++, Java, C#, Perl, Matlab/Octave).</p>
<p>Scripting 101: Familiarity with the most basic programming concepts such as variables, methods, control structures, etc. without the overhead of more advanced programming concepts to provide a comfortable “wade-in” point for those new to programming.</p>
<p>The Hardware/Software Interface: Digital logic (boolean algebra, logic gates, KV maps, etc&#8230;), assembly language</p>
<p>Source Code Control and the Build Process: CVS/SVN/git, committing code, assigning defects/features, creating a backend build process.</p>
<p>Sophomore Year – Filling the toolbox</p>
<p>Data Structures and Algorithms (2-semester interleaved course):  big-O, lists, arrays, hash tables, binary trees, searching, sorting, &#8230;</p>
<p>Programming in [Student’s Choice]: In depth programming course in the language of the student’s choice.</p>
<p>Debugging/Troubleshooting:I am amazed at how impressively bad a lot of working programmers are at this. Suggested Textbook: “Debugging: The 9 Indispensable Rules for Finding Even the Most Elusive Software and Hardware Problems.”</p>
<p>Debottlenecking Code: profiling, optimizing, Static/Dynamic code analysis.  Focus on CPU-bound applications.</p>
<p>Networking Basics: Topics including, networking hardware, topologies, basic signaling, and protocols.</p>
<p>Junior Year – Sharpening the tools</p>
<p>Application Architecture: Become familiar with common application architectures, associated issues, and relevant technologies. (Desktop, Client-Server, N-Tier, Web, Embedded, AJAX, etc.)</p>
<p>CRUD Applications 1:  Microsoft Access, data normalization, SQL, queries, frontend UI, reporting</p>
<p>CRUD Applications 2:  Migrate application developed in CRUD Applications 1 to 3-tier web/app server/SQL server</p>
<p>Programming Technique: OOP, Design Patterns, Refactoring, Coupling Cohesion.</p>
<p>Technical Writing: a general technical writing course from the English department</p>
<p>Software Engineering Ethics:  history of famous software mistakes, IP issues, the conflicts between making money and doing the right thing</p>
<p>Senior Year – From machinist to craftsman</p>
<p>Building A Non-Trivial Application: Each student (individually only) builds anything they want (2D/3D game, business app, &#8230;) using any programming language they wish.  It must exceed 3000 LOC and be reasonably commented.  In the final portion of the course, they must implement a new non-trivial feature in a classmate&#8217;s project.</p>
<p>Testing Software: Tools and technique (Unit, Automated, Load, Regression, Integration)</p>
<p>Usability / User Experience: Suggested text – “About Face 2.0: The Essentials of Interaction Design”</p>
<p>Programming for a Diverse world: character sets (ASCII/CP437/Unicode etc.), string replacement (I18N/L10N/BiDi), issues in N-tier architecture</p>
<p>Computer Security: crypto/SSL/PKI, worms/viruses (including writing them), exploits (buffer overflow, SQL injection, etc.)</p>
<p>The Project Lifecycle:  Requirements Gathering, Use Cases, Prototyping, Agile, Waterfall, etc.</p>
<p>&#8212;-snip&#8212;-</p>
<p>Very similar to your list, but a few additions and re-groupings.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: links for 2009-06-13 - sashidhar.com</title>
		<link>http://improvingsoftware.com/2009/06/03/what-programmers-should-be-learning-in-college/#comment-191</link>
		<dc:creator><![CDATA[links for 2009-06-13 - sashidhar.com]]></dc:creator>
		<pubDate>Sat, 13 Jun 2009 09:12:19 +0000</pubDate>
		<guid isPermaLink="false">http://improvingsoftware.com/?p=725#comment-191</guid>
		<description><![CDATA[[...] What Programmers Should Be Learning in College « Software++ (tags: programming education)      You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site. [...]]]></description>
		<content:encoded><![CDATA[<p>[...] What Programmers Should Be Learning in College « Software++ (tags: programming education)      You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site. [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: sunday</title>
		<link>http://improvingsoftware.com/2009/06/03/what-programmers-should-be-learning-in-college/#comment-187</link>
		<dc:creator><![CDATA[sunday]]></dc:creator>
		<pubDate>Fri, 12 Jun 2009 20:01:17 +0000</pubDate>
		<guid isPermaLink="false">http://improvingsoftware.com/?p=725#comment-187</guid>
		<description><![CDATA[Well this all what a programmer should learn, but not a computer science engineer]]></description>
		<content:encoded><![CDATA[<p>Well this all what a programmer should learn, but not a computer science engineer</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: kcw</title>
		<link>http://improvingsoftware.com/2009/06/03/what-programmers-should-be-learning-in-college/#comment-162</link>
		<dc:creator><![CDATA[kcw]]></dc:creator>
		<pubDate>Thu, 11 Jun 2009 20:08:53 +0000</pubDate>
		<guid isPermaLink="false">http://improvingsoftware.com/?p=725#comment-162</guid>
		<description><![CDATA[Magice++

Most of this is tools/techniques.

The above plan is great until your boss ask you to &quot;figure this out and build it.&quot;]]></description>
		<content:encoded><![CDATA[<p>Magice++</p>
<p>Most of this is tools/techniques.</p>
<p>The above plan is great until your boss ask you to &#8220;figure this out and build it.&#8221;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Magice</title>
		<link>http://improvingsoftware.com/2009/06/03/what-programmers-should-be-learning-in-college/#comment-150</link>
		<dc:creator><![CDATA[Magice]]></dc:creator>
		<pubDate>Thu, 11 Jun 2009 15:49:50 +0000</pubDate>
		<guid isPermaLink="false">http://improvingsoftware.com/?p=725#comment-150</guid>
		<description><![CDATA[Okay, this is good for, say, community college or something like that, but not for a university program. Here are some problems:

1. Too few theory. Face it: you don&#039;t go to university to be a coder, but a programmer, who understands, appreciates, and effectively use ALL technologies, past, now, or in the future. To do that, theory about computation, computer science, algorithms, etc. must be taught. You don&#039;t think these are important or something?

2. Yeah, talking about algorithm, you don&#039;t include that. This is a HUGE mistake. Algorithms are EVERYTHING in programming! With a proper algorithm, you can program in ASM as well as in Javascript. Omit it, and you produce bad programmers.

3. Too little coding. I learn something new every 500 lines of code. A good program should spend AT LEAST 1.5 years into coding and maintaining code, plus other code-related activities.

4. Too little time allocated to liberal arts. Okay, I know, some people under-appreciate these things, but they broaden a person&#039;s mind and afford creativity. Plus, they don&#039;t need to be too heavy. Your program is too heavy to leave room for them.

5. Wrong order. One should learn how to solve problems (algorithm, math background, etc.) first, then go on and apply these methods. You do the reverse. This is no good: the students will become too into coding, and don&#039;t pay good attention to design matter.

Otherwise, nice plan.

Editor&#039;s note: I fixed a small typo in this comment.]]></description>
		<content:encoded><![CDATA[<p>Okay, this is good for, say, community college or something like that, but not for a university program. Here are some problems:</p>
<p>1. Too few theory. Face it: you don&#8217;t go to university to be a coder, but a programmer, who understands, appreciates, and effectively use ALL technologies, past, now, or in the future. To do that, theory about computation, computer science, algorithms, etc. must be taught. You don&#8217;t think these are important or something?</p>
<p>2. Yeah, talking about algorithm, you don&#8217;t include that. This is a HUGE mistake. Algorithms are EVERYTHING in programming! With a proper algorithm, you can program in ASM as well as in Javascript. Omit it, and you produce bad programmers.</p>
<p>3. Too little coding. I learn something new every 500 lines of code. A good program should spend AT LEAST 1.5 years into coding and maintaining code, plus other code-related activities.</p>
<p>4. Too little time allocated to liberal arts. Okay, I know, some people under-appreciate these things, but they broaden a person&#8217;s mind and afford creativity. Plus, they don&#8217;t need to be too heavy. Your program is too heavy to leave room for them.</p>
<p>5. Wrong order. One should learn how to solve problems (algorithm, math background, etc.) first, then go on and apply these methods. You do the reverse. This is no good: the students will become too into coding, and don&#8217;t pay good attention to design matter.</p>
<p>Otherwise, nice plan.</p>
<p>Editor&#8217;s note: I fixed a small typo in this comment.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Mike</title>
		<link>http://improvingsoftware.com/2009/06/03/what-programmers-should-be-learning-in-college/#comment-131</link>
		<dc:creator><![CDATA[Mike]]></dc:creator>
		<pubDate>Thu, 11 Jun 2009 12:54:30 +0000</pubDate>
		<guid isPermaLink="false">http://improvingsoftware.com/?p=725#comment-131</guid>
		<description><![CDATA[I&#039;d like to take these all over again ( :

This would not be a CS degree. You called it a Software Engineering degree? Would you name it anything else? Something new perhaps?

&quot;From machinist to craftsman&quot; - I don&#039;t think you can call your self anything but a novice or apprentice until you get in to the real world and get a few years under your belt.

A good writeup and a good read though. Thanks.]]></description>
		<content:encoded><![CDATA[<p>I&#8217;d like to take these all over again ( :</p>
<p>This would not be a CS degree. You called it a Software Engineering degree? Would you name it anything else? Something new perhaps?</p>
<p>&#8220;From machinist to craftsman&#8221; &#8211; I don&#8217;t think you can call your self anything but a novice or apprentice until you get in to the real world and get a few years under your belt.</p>
<p>A good writeup and a good read though. Thanks.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: johnfx</title>
		<link>http://improvingsoftware.com/2009/06/03/what-programmers-should-be-learning-in-college/#comment-109</link>
		<dc:creator><![CDATA[johnfx]]></dc:creator>
		<pubDate>Wed, 10 Jun 2009 20:49:08 +0000</pubDate>
		<guid isPermaLink="false">http://improvingsoftware.com/?p=725#comment-109</guid>
		<description><![CDATA[I appreciate your perspective, but also feel that the burden of growth and current skills should be on the engineer and not the University. Ultimately I think we agree more than disagree. I tried to build this curriculum to be heavy on theory with just enough technical content to allow the student to apply that theory in a practical context.

Thanks for your feedback!]]></description>
		<content:encoded><![CDATA[<p>I appreciate your perspective, but also feel that the burden of growth and current skills should be on the engineer and not the University. Ultimately I think we agree more than disagree. I tried to build this curriculum to be heavy on theory with just enough technical content to allow the student to apply that theory in a practical context.</p>
<p>Thanks for your feedback!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: vam</title>
		<link>http://improvingsoftware.com/2009/06/03/what-programmers-should-be-learning-in-college/#comment-108</link>
		<dc:creator><![CDATA[vam]]></dc:creator>
		<pubDate>Wed, 10 Jun 2009 20:27:17 +0000</pubDate>
		<guid isPermaLink="false">http://improvingsoftware.com/?p=725#comment-108</guid>
		<description><![CDATA[If Universities were to follow a curriculum like this they would be preparing students for your companies and not in engineering and life. Universities job is to prepare students for work but also for life. I prefer that they teach theory, math, and fine tune basic programming that the needs of web 2.0. It is the responsibility of a corporation to keep the education of the engineer going. Which is something you see less and less in corporate America.

Now that you wrote this. Tell us about the curriculum you will put in place for engineer so they develop and grow?

[Note: I fixed some typos in this comment, but did not alter the content otherwise.]]]></description>
		<content:encoded><![CDATA[<p>If Universities were to follow a curriculum like this they would be preparing students for your companies and not in engineering and life. Universities job is to prepare students for work but also for life. I prefer that they teach theory, math, and fine tune basic programming that the needs of web 2.0. It is the responsibility of a corporation to keep the education of the engineer going. Which is something you see less and less in corporate America.</p>
<p>Now that you wrote this. Tell us about the curriculum you will put in place for engineer so they develop and grow?</p>
<p>[Note: I fixed some typos in this comment, but did not alter the content otherwise.]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Mikhail</title>
		<link>http://improvingsoftware.com/2009/06/03/what-programmers-should-be-learning-in-college/#comment-104</link>
		<dc:creator><![CDATA[Mikhail]]></dc:creator>
		<pubDate>Wed, 10 Jun 2009 17:14:30 +0000</pubDate>
		<guid isPermaLink="false">http://improvingsoftware.com/?p=725#comment-104</guid>
		<description><![CDATA[I would put your listing exactly in reverse order. You put testing, debugging for the last. But this is the entrance into software engineering! Your Freshman Year items like operating systems are just implementation details and would be better understood with some experience (e.g. microkernel).]]></description>
		<content:encoded><![CDATA[<p>I would put your listing exactly in reverse order. You put testing, debugging for the last. But this is the entrance into software engineering! Your Freshman Year items like operating systems are just implementation details and would be better understood with some experience (e.g. microkernel).</p>
]]></content:encoded>
	</item>
</channel>
</rss>

