Software Development

A pragmatic approach to training programmers, part one


One topic that seems to generate a lot of discussion in the TechRepublic forums is the proper education for a programmer. I have come to believe (largely influenced by these discussions) that there should be two educational tracks for software programmers: a true computer science program that focuses on a very mathematical, theoretical approach to programming, and a hands-on route that educates people to be real-world programmers.

Today, I will present what my ideal course listing for such a path might be. I do not think that this type of course would necessarily be taught in a college setting, since it is more vocational training than theory study (I also think colleges have no business granting MBAs either). However, the program will be split into the traditional eight semesters minus the general education requirements, and electives will only be available in the final year of study. (Note: I hoped to have some timings on Perl vs. C# this week, but I had to postpone it. Soon... I promise!)

Semester 1

Introduction to Programming
This course focuses on the basic structure of a program: control statements, looping, conditions, and so on. It would ideally be taught in a very simple, trickery-free procedural language, one that supports (but does not need to use) OOP. It would also need to enforce good programming habits. I suspect that (unfortunately) VB.Net with Explicit and Strict turned on would be the best fit for this, or possibly Ruby (I do not know enough about it to say for sure). Pascal would also be a good candidate for this course.

Symbolic Logic 1
This course teaches the basics of constructing a formal logic proof or disproof.

Requirements Gathering
The focus of this course is collecting the business requirements of a project, learning who the key stakeholders are and getting information from them, getting in touch with actual users to determine their needs, and so on. Heavy emphasis is placed on learning the "why" of the project, even when the customers are focusing only on the "how." The course will also teach you how to present the best approach to a project even though it may not be what the customer thinks they want or need.

Networking and System Administration Basics
A course that helps programmers understand the environment that their software will be running in, particularly in the modern world, is needed. This course teaches students enough basic networking and system administration to be aware of common problems in a production environment and how to anticipate them in code. Special focus will be placed upon permissions and TCP/IP troubleshooting.

Semester 2

Usability and Accessibility
Good programmers need to be aware that all users have certain needs in common (usability) and that some users have special needs (accessibility). This is a code-free course that explains the fundamentals of how good interface design serves the needs of the users.

Symbolic Logic 2
An advanced course in symbolic logic.

Database Theory
This course takes the student through an exploration of sound database design. There will be information about relational databases and normalization, as well as learning about the different needs of an application and reporting. The proper use of indexes, primary keys, views, stored procedures, and so on will receive particular focus.

Programming Fundamentals
Using an extremely stripped down language (similar to EdScheme), the students will spend a semester building a number of basic libraries to extend a language that is restricted to simple primitive types and control structures to be a full-fledged language.

Object-Oriented (OO) Design
Students will be taught OO design and programming techniques. There will be significant time discussing the proper architecture of OO projects and how to leverage OO techniques to work in a team environment.

Semester 3

Data Structures
Taught in C, this course will walk students through common data structures such as linked lists, stacks, queues, graphs, trees, etc.

Technical Specifications
Building upon the Requirements Gathering course, this course teaches students how to translate business requirements into technical specifications. Special attention will be paid to the differences between how business users express ideas and how technical people understand ideas.

Data-Driven Applications
Students will build data-driven applications, combining their knowledge of OOP, databases, data structures, and interface design to construct simple client/server applications.

Basic Web Design
HTML, CSS, and JavaScript will be taught, along with the basics image editing tasks that a programmer typically uses. Emphasis will be placed on standards compliance and creating usable, accessible Web sites.

Semester 4

Data Validation
In this course, students learn about the need to perform data validation, and techniques to perform it. Basic regex instruction will be provided as well.

C++ 1
A beginner's course on the C++ language with an emphasis on working with objects and writing bulletproof code.

Dynamic/Interpreted Languages
A survey of different dynamic and interpreted languages in common usage, including Perl, Ruby, Python, and JavaScript. Students will learn the unique properties of dynamic/interpreted languages and how to leverage them within the proper context.

Reporting
Students will be shown how to create data models for reporting and to create reports. Extra attention will be placed upon discerning the best way of displaying data to the user in an easily understood and consumed manner.

Stay tuned: Next week I will post part two of this series.

J.Ja

About

Justin James is the Lead Architect for Conigent.

117 comments
osiraten
osiraten

Hi Justin I like your approach and reason for these courses.I'd like to ask if you can recommend a vocational school that may have these tracs, particularly in the New York City area? My primary interests are in SQL Server programming. Thanks Samuel

Nodisalsi
Nodisalsi

Before trying to train someone how to code, I would hope that the candidate had some academic credentials in Mathematics and English which were strong enough for them to enter tertiary education; otherwise there's a greater risk of training someone who is not suited to this career choice.

C_Tharp
C_Tharp

The discussion has focused on what is taught. Another aspect is how it is taught. When I went through a computer science cirriculum, I felt like I was starting with a blank slate in each course. The work done in previous courses was not usable in succeeding courses. I am talking about the code and designs, not about the concepts. The body of work should build throughout the cirriculum and provide the basis for examining conflicts, compromises, performance, integration, design, development, maintenance, and evolution. The beginning courses would have the student creating components that could be reused in later courses. Each student would be creating personal libraries that would be expanded throughout their studies. Later courses would have assignments that use the components in different ways than originally intended. Knowledge and time constraints would force decisions that would require revisions, later. The idea is to be creating code in a real world senario, though it is being used for instruction instead of commerce. The programs created in early courses could be assembled later into a system. User interface, data flow, timing, and error handling would change. The applications could expand to include a network, preferably, with different operating systems. This does not require one language to be used throughout. In fact, exploration in different languages will confront the problem of integrating different languages in one program or a system of programs. It will highlight the differences in the way that languages interpret data and control the program. Applying the pieces to different problems should illustrate the pros and cons of different solutions. Along the way, the student should be forced to apply other people's code to solve a problem. Some of this code should be black box and some should be fully accessible. This should illustrate the problems of object design, abstraction, encapsulation, limitations, error handling, readability, and documentation. Perhaps the students should make the selections of components to be shared. That requires peer review and evaluation to standards. When they use the components, they see the results of that effort. The idea is to simulate a business environment where the student is learning and building as they proceed. New requirements appear through time and code is reused, rebuilt, or built to solve the problems. Along the way, the issues and properties are taught as they are encountered. The graduate has a cohesive set of knowledge rather than a collection of independent pieces. The progression teaches a style of learning that is necessary for a carreer.

Chomps
Chomps

A great thread with a wide selection of interesting and valuable ideas. Now, let's get a wiki and build this course together, building on this wealth of knowledge, experience and ideas... Peter(1960/70s programmer; 2007 educator)

Mark Miller
Mark Miller

Someone else mentioned security. I think that would be good, because it's not taught now at all, as best I can tell. I'd also put a focus on how to estimate how long something will take. This is a very pragmatic skill, and when I was taught CS we did a very general overview of estimation techniques, but didn't actually dig into the meat of them. Perhaps you'll get into this in the next part, but you didn't mention much about algorithms, beyond data structures. I'd say it would at least be good to discuss the concept of Big-O notation. As I was looking over your list, I couldn't help but think that a lot of that is covered in a good CIS program right now. Not much of the science/theory stuff, but things like requirements gathering, database theory, technical specifications, and basic web design. I'm not sure, but it's not inconceivable they'd also cover user accessibility and data-driven applications as well. They're covering the pragmatic stuff now. The main difference between their program and your suggestions is they're doing it all in Java/J2EE.

pmwpaul
pmwpaul

What about documentation? That should be included from day 1 and in all classes afterward.

asranzan
asranzan

I think that a good programmer need a good knowledgement of operating systems, specially on the command line. Obviously, special attention to details of programs: Why, What, How.

a_erin
a_erin

I think a course should be offered, maybe two, strictly on interface design, and that it should be offered early. I have discovered that most of my programming problems disappear when I have created workable user interface mockups. The structure of the program architecture benefits when the result the user sees is always in mind. It tends to simplify the database tables and links, making for a much more stable and Object-Oriented program. As part of this course, surveying real users for the features they really need and the ways they would like to access and use them, should be taught. And no focus-group testing: use non-geek employees to test your interfaces on for understandability, as Joel Spolsky recommends in his book: "User Interface Design for Programmers." This would be an excellent text to use for a curriculum such as you describe here.

sjohnson175
sjohnson175

Your course is very close to the MIS program I got my degree in. We didn't have some of the more advanced stuff like C++ but did have non-IT courses like marketing, accounting and various management courses. The non-IT stuff equipped us to deal well with non-IT parts of the organization. What did strike me though was how many of my fellow MIS students had NO desire to program or learn anything else technical. I couldn't believe it when about 30% of one of my early classes threw a fit because the instructor only made the syllabus available via FTP server. Berating them for being technophobes in a tech major didn't win me many friends. :)

bluemoonsailor
bluemoonsailor

You forgot a class on Analysis of Problems - how to test, how to optimize and how to debug. I've seen any number of (otherwise good) programmers spend loads of time following red herrings because they had no clue how to approach a problem or how to do 'single variable' tests.

NatureBuff
NatureBuff

Justin, Great start, I'm looking forward to part II, III... I received my degree in the early 80's in Comp Sci and have taught at the university level as well as being a MCT. What you are doing is long over do. Next task will be convincing the tech schools and colleges to do something that makes sense. GOOD LUCK!!! ... lol

BOUND4DOOM
BOUND4DOOM

Security? Your just asking to produce apps that get hacked and ripped apart without some security training specifically. Having taken computer science years ago when ADA was the Number one language, security techniques were never taught, and being a senior programmer now I have learned the hard way through time security best practices.

udayan.banerjee
udayan.banerjee

India has been folowing this approach for many years. There are two distinct stream of Computer Science and Computer Application/Infirmation Technology.

Justin James
Justin James

If you had to put together a "perfect" set of courses to train someone with only basic computer knowledge but a lot of aptitude to be a developer, what would the courseload look like? J.Ja

Justin James
Justin James

Samuel - I wish I could help with a recommendation, but I am not familiar with a school like this, in NYC or anywhere else. The best I could suggest would be to take a look at CUNY's offerings or SUNY's, and see what they look like. Both school have a good (or at least they used to, not sure about lately) reputation, and are reasonably priced. J.Ja [Edited 8/4/07 to change "of" to "or"]

Justin James
Justin James

... going to write a Part 3 which covers things like prerequisites, teach methodology, and so on! Reading the comments, I see that this 2 part series needs that kind of information now. :) J.Ja

Justin James
Justin James

I have decided to write a third part to this, detailing these types of things! :) J.Ja

Tony Hopkinson
Tony Hopkinson

We never get the chance to do it! Methods of self documenting certainly should be in there.

Tony Hopkinson
Tony Hopkinson

One of teh big problems is overly focusing on one interface aspect of the system. MIS Systems for instance. Presenting a good UI for one of these is of course a requirement, so is quality data collection. Most of teh time those two aspects of the interface are mutually incompatible. At that point compromise and or a new look at the big picture are required. If you do reall high speed data collection, often OO is too espensive and inefficient as as a description of the problem. As always in our job though, having to compromise is not the real problem, not knowing you have is the one that makes you look like a pratt.

hlhowell
hlhowell

This brought to mind some issues I have seen in interfaces, 1. Language. Different languages have different sentence structure, which leads to misconceptions, so some guidance on working with an interpreter for other languages would be nice (maybe advanced or extra credit). 2. Graphics design. I have a son who is a real artist (paid and everything), and he taught me a great deal about "look" relating to concepts. His sons are in commercial graphics design, and doing well. They can express so much with a single drawing or concept, and that is totally missing from programming today. 3. Emotional response. I have seen some stuff on design that addresses the way to create "prescan" information presentation, related to say most frequent use or greatest acceptance. Where the interface doesn't move things around, but rather emphasizes them with size/color/shapes or other attributes to draw attention to them, which simplifies the user search for common (or emergency) commands and controls. These are sadly overlooked in computer courses, and I don't know that many people could do the programming and acquire these "humanity" types of knowledge, so a course on how to accept and implement input from other specialities would be GREAT and do a lot to advance the science (AND ART) of programming. Regards, Les H

Justin James
Justin James

Too many people think the "M" in "MIS" means "Manager", not "Masters". Those are the folks you are talking about. They want to know just enough tech to think they might convince the people they manage that they are not a pointy-haired boss. And MIS degree should be technical enough to at least understand what the people and systems you are working with are doing, and if someone does not want to know that, they should be persuing an MBA, not an MIS degree. J.Ja

victor.camacho
victor.camacho

I'll include some clases like accounting and business administration and maybe some optional clases like inventory management or production managment, all of the IT stuff is great but if you dont know how the business works is hard to apply all that knowledge

Justin James
Justin James

... that's why I included Symbolic Logic. As part of my, ugh... liberal arts degree (which is a huge clue to one of my embarassing majors), I had to take symbolic logic. That course taught me reams about debugging and code writing in general, and it is why I include it early on in my coursework. ;) J.Ja

Justin James
Justin James

Thanks for the kind words! I like one poster's suggestion to submit it to the IEEE. J.Ja

bedrich.magas
bedrich.magas

In 1983 started (Level 1) with hexa, booleans, assembler, architecture, flowcharting,Basic translated to Pascal, Fortran and Cobol programming for sophomore Electrical Engineers. Later, started a Computer Science (8 semester) program. (Level 2) Benchmarking, data structures, files handling: local (data bases) and remote (hypertext, html, xhml, css, page validation through W3C). (Level 3) Software engineering, stressing requirements engineering, UML design, and teamwork with stepwise development. Good results, a lot of fun with students, good employability in process control and IT, and (yes!) C++ proved to be (still) the best: halfway from objects to assembler. Just thanks to you all for talking about it! Is nice to know from the rest of this (distant and "real") world... And, yes, we are "naive". Proudly!

Justin James
Justin James

If you have any details you could share about this, I would love to know more! Thanks! J.Ja

cc2be
cc2be

I was in college in the early 80's, and we had two tracks we could take - computer science (heavily math oriented, lots of assembler, writing compilers, etc.) or computers in business (Cobol, Basic, etc.). Several courses intersected between the two paths, such as logic. I went down the business path, but the main thing I realized after getting into the "real world" is that college did not prepare me very well. In college they set the students up to succeed in their programs, it seems like at my job they set us up to fail - my favorite being "I know that's what I told you, but it's not what I meant".

jslarochelle
jslarochelle

With so much to learn these days I think it might be usefull to split the program into different specialization. Everyone would need a common background but later courses might focus on different aspect. For example I think it might be usefull to have a path that focusses more on hardware and low-level stuff: device drivers, FPGA, etc... Another path might focus more on things like database, web, etc... Of course those programs would include many of the good suggestions made in this post by you and others. JS

Tell It Like I See It
Tell It Like I See It

I'm not sure what the class would be called properly, but the basic idea is that the students (plural) are given a project to complete. The "teachers" pretty much let the students work during the class time. The students have to organize themselves, based on their specialties. They have to actually figure out what the project is really about (requirements gathering), and then they actually have to put something together and complete the project work. Obviously, this would be later in the curriculum. (Hopefully Justin will forgive me if I'm jumping the gun on this one a bit). I also think that it might be best to have this over two quarters. The first quarter is about the organization, requirements gathering and presenting "the plan" to the sponsors (the teachers). The second quarter is the actual work of making it happen and deploying it. Depending on how things work out, some of the work might begin nearer the end of the first quarter and continue on to the second quarter. If the people in the group changes somewhat between the quarters (some drop off, new people come on), even better. Yes, I see this as a group exercise. If there are only a few students in this class, then treat it as a class project. If there happen to be a lot of students, break the students into different groups. You could have different groups do different projects, or you could have each group work on the same project to highlight different approachs to solve the same problem.

Elmonk
Elmonk

Having taken up programming some 40 years ago (assembler of course) and worked in IT since both as analyst and developer as well as in teaching / training I'm still convinced that certain basic skills need to be present to start with - first and foremost an affinity to languages, which I value even higher than maths. It helps a lot to know early on about how a language - natural or artificial - is constructed and to be able to compare, i.e. find out similarities and discrepancies. Is it far fetched to attribute part of the success of e.g. Indian programmers on the fact that they need to know at least one foreign language before taking up studies? Could this be a major drawback for the US, where there is still widespread belief that all over the world English is spoken and understood?

hlhowell
hlhowell

Creative writing. A good computer program is a lot like a good story. The declarations and header information are the introduction to the characters, the main is the plot, and the subroutines are the chapters. Wnen one can outline a story, write it, keep a good thread, and keep the plot moving, one has the basics of what good structure does for writing, whether it is code or comments or documenting what is done. Writing needs to be taught as a science of communications, The computer program is the process of communicating a set of instructions to the machine. They (writing and programming) are closely related. Not to mention that many engineers are totally unequipped to document or describe what they are doing. (present author included). Regards, Les H

mdhealy
mdhealy

Your suggested courses all sound excellent and worthwhile -- I might quibble with this or that detail, but the general thrust is sound. Everybody says education needs to be a mixture of theory and practice, but it is very hard to give both adequate coverage in N semesters! However, beyond the specifically technical, I think every student of computer programming nowadays should be required early on to declare a specific non-IT domain in which he or she will acquire sufficient depth of expertise to be seen by people in that field as a colleague. Without strong domain knowledge, one risks getting stuck in low-level grunt work that could be outsourced. In my own case, I have a BS in Engineering, a PHD in biology, and considerable experience as a researcher in both industry and academia. However, I think there need to be less laborious paths to combined IT and domain knowledge than mine!

SnoopDoug
SnoopDoug

IIRC, Joel had two major sticking points when considering the talent of programmers/developers/software engineers. Do they grok: * Recursion * Indirection (aka pointers) I too am a geezer from the '80s. In my day you had EE or CS, no IT yet. Two things struck me about working in the real world after university: * Meetings. Oh the humanity! I'm not sure how a course could prepare you for these. * Working as a team. I had one terms where we did something in assembly as a group. I would suggest a two-term series, splitting the class into 4-6 person groups. Term 1 would gather requirements, write a spec, create UML diagrams and use cases. Term 2 the teams would be remixed and projects from term 1 would be randomly assigned to teams. I can hear the b*tching and moaning now. Welcome to the real world kids! doug in Seattle

Jason Norris
Jason Norris

I'm trying to advance my programming skill by learning some more advanced concepts, while adding languages as well. Does anyone have suggestions for great theory books, or really good books for learning .NET languages?

techrepublic
techrepublic

I finished a Bachelors of Professional Studies in Internet Programming and Technology not too long ago from Empire State College (SUNY). The point being that I could design my own course to fit my own needs. (Which was "perfect" for me.) While I think we can all (well, most of us) agree on a certain commonality of foundation courses, you have to ask what the training will accomplish? Is the programmer going to do web apps, client user apps, server apps, server systems, embedded systems, device drivers, etc.? So... No "perfection" without a better description of the job. "Developer" is too broad. In a four semester course, you have to include the following: Critical Thinking I and II Introduction to Microcomputers/Microcontrollers Boolean or Symbolic Logic Databases I (client) and II (server) Systems Analysis I and II Intro to assembly (Intel and Motorola (Freescale)) (Complex and reduced instruction sets) Intro to Operating Systems Intro to Scripting Languages Intro to OOP I see I've listed 12 courses. Some of the courses I've listed, include Justin's courses under a different name. (e.g. Data Validation is included in Databases, Reporting is included in Systems Analysis.) As a head-to-head comparison: His --> Mine Intro to Programming --> Assembly Symbolic Logic --> Boolean Logic Requirements Gathering --> Systems Analysis Networking --> (not included for general ed.) Usability and Accessibility --> Systems Analysis Symbolic Logic 2 --> (no one needs 2 semesters of this, if you don't get this instinctivly, you shouldn't be a programmer) Database Theory --> Systems Analysis Programming Fundamentals --> Assembly Object-Oriented Design --> Intro to OOP Data Structures --> Databases I Technical Specifications --> Systems Analysis Data-Driven Applications --> (various) Basic Web Design --> (not included for general ed.) Data Validation --> Databases I C++ 1 --> (not included for general ed.) Dynamic/Interpreted Languages --> Intro to Scripting Languages Reporting --> Systems Analysis

oz penguin
oz penguin

You have to include SQL. I have met soooooo many people who claim to know how to write SQL, but only at a very basic level. SQL is a topic where a "little knowledge" is a dangerous thing. It is also very subjective Oracle and Sybase follow very different tacts of thought and require very different approaches to producing code,

jmgarvin
jmgarvin

However, I would include: System Programming Secure Programming Not only would it give the student a good way to get started with a broad knowledge base, but it would also introduce students to very important topics that aren't usually covered very well at all.

Dr Dij
Dr Dij

1) avoiding stack overflows 2) avoiding executing code / script inside malformed data objects (malformed jpeg flaw for example?) Ask the question, why in the world would a data stream meant to be processed as a picture actually ever execute anything? If you get more detailed you should propose this to the IEEE curriculum; posted link last discussion.

Tell It Like I See It
Tell It Like I See It

I'd consider (eventually) taking the students all the way down to assembler language. Nothing too complicated, but enough that they can A) appreciate higher-level languages more and B) get a much better understanding of how the low-level computer storage and functionality work. I'd also consider OS classes - or else merge this with the network environment classes. This would help the developer-to-be learn more about what the OS provides that might help them with their development. Problem Diagnosis / Debugging. The focus on this would be to determine what might be wrong in a given scenario, without using an IDE debugger and without using an Internet Search. For example, if a program fails and you know it is trying to open a text file, try to open the text file in Notepad -- if you can't open it, you'll know it is security/permissions related. Security. Perhaps a special class that gives general security information, but also incorporate security into many of the "hands-on" classes. Although not exactly a class, I'd like to see them trained (somehow) that they don't have to use just one tool to solve a problem. For example, export something out of a program to Excel if it that is all it will export to. Use Excel to save to a text file. Use your favorite text editor with macro capability to modify the text file. Import the text file back to an Excel file so it can be brought back into the original program. This sequence might take, oh, say an hour; to update the original program directly might take a week. I'm not sure what you would call this. A requirement for this is to be able to think several steps ahead of where you are. In addition to everything else mentioned, I'd eventually split the students into various development specialities; each specialty would have its own additional classes. For example, web developers would get classes covering Photoshop or other image editing software; while database developers get deeper SQL knowledge.

Tony Hopkinson
Tony Hopkinson

Some real basics. Binary, hex, boolean algebra, state machines, simple processor architecture, give the student a sense of what goes on inside the chip. I wouldn't start with a language at all. I'd start with writing down the steps to make a cup of coffee. I'd keep going back to that example to illustrate the concepts. More than one coffee, subroutine to purchase more coffee. More than one person making their own coffee. A coffee making service.... Far too often programming is taught in dribbles. Little meaningless snippets to say use a circular array or a linked list etc. A lot of the questions are fill in the blanks, that's coding not development. The other thing I'd want is team approaches, working on other people's code, your own months later. If they come out with readability / maintainability as the most important requuirements, they'll be shed loads better off than the unfortunates who come out of academia now.

alaniane
alaniane

instead of teaching how to document code by using comments, it would be better to teach how to write simple self-documenting code.

Tony Hopkinson
Tony Hopkinson

course :D There are some really good examples in your list of things to get familiar with, to build a project to learn from. Purchase Ledger, Link to Inventory ReOrdering to Net Requirements Management ... To Inventory Going to be too basic to being anything more than an appreciation of the types of system, or foolishly detailed so you end up with a noob who can't code but knows how to produce a month end report from MS Money. A lot better than the crap they get to now mind, towers of Hanoi et al.

Justin James
Justin James

But to do it as an extra year or two at the end. For the final two semesters, I am planning to have a number of electives, to allow students to pick the things that they gravitate towards, but not a full-blown specialization. J.Ja

Justin James
Justin James

Yup, those were exactly my thoughts as well. One of the great drawbacks that I see with traditional CS courses is that students only learn how to work in isolation. The second half will have a ton of team/partnership stuff, including a "development methodology" course, in which students will pretend to be indecisive customers to other students, while trying to work on their own project for a customer that keeps changing their mind. J.Ja

Tony Hopkinson
Tony Hopkinson

The students should start their bit and finish someone else. They'll learn more about the practical aspects of coding from that than anything else in the course. Other things, one collects requirements and documents one impelments, the other tests, another validates... Sheesh one can play teh customer. Then swap, see what each learnt from phase one. It's this sort of thing that is the single biggest failure in current academic courses. Readability, maintainability, scopes, dealines, requirements management, maintenance plans installation, requirements expectation, ie the important stuff that they'll need when they get into our world.

Justin James
Justin James

I agree 100% that math skills and language skills are important. The idea behind this is to act more as a "vocational training" rather than a traditional CS course. One of the things I see more and more is that the traditional CS course (different from what most places now call "CS") churns out brilliant people who often have no handle on "real world" work. On the flip side, the neo-CS courses that stick with Java or .Net, and try being more "hands on" ignore too many fundamental aspects of theory. This course I am presenting tries to give theory with a hands-on approach. Putting a lot of time into "general education" dilutes that, and takes it back towards a "college" or "university" type of education, and away from "vocational training". J.Ja

Wayne M.
Wayne M.

I am not sure anyone going into programming has enough industry knowledge to pick a domain speciality or ensure that he will get hired into that domain. I also believe any domain knowledge will be out of date with 1 - 5 years. The better approach is to learn to rely on subject matter experts to provide domain specific knowledge - I have run into far too many programmers who knew better than the users on what the users needed for their jobs.

Tony Hopkinson
Tony Hopkinson

Not sure now you could out with this, both engineering and biology are very broad domains. What you should learn is how to apply your skills in the domain, so certainly more than one would be useful in the course. When you get down to the business level you could try to say stores is stores and ledgers are ledgers but it's the differences that will trip you up. Mainly they'll do that through foolish assumptions about how one thing in one implementation = one with the same name in another. Actually assumptions and why not to make them would be a good addition to the course. Picking up Business Knowledge is a skill you can learn, the business knowledge itself, well that comes with experience and cultivated naivety. You are a biologist, so you can tell me what a bloom is yes?

alaniane
alaniane

I would give them a project where they have to gather requirements from two or more different "managers" who give conflicting views. Each "manager" wants the app to fit his particular department's way of doing things. Have them learn how negotiate compromises that will allow for more efficient app without creating an inter-company war.

Justin James
Justin James

Best place to start is MSDN Magazine, IMHO. J.Ja

Justin James
Justin James

I think a lot of readers missed the few words I had in there mentioning that this is a two part series... don't worry, next week, things will get more detailed. One reason why your courses are a bit different than mine, is because I am breaking out certain areas of knowledge into many courses, and you are compressing them to fit a 4 semester program. J.Ja

Tony Hopkinson
Tony Hopkinson

More of building in depth knowledge in particular technologies though. Developers are by definition multi skilled nowadays and jobs where you have web debloper and database developer as separte functions are getting more and more rare. One project I designed a MySQL database, installed it on a linux box (Installed linux as well. I had PHP status pages after I'd set up Apache, perl admin scripts, wrote to the DB from Fortran code under VMS calling C++ libraries and displayed it from a VB6 client under windows. Oh I did the windows installer too. How many specialities is that ? Go down the specialist route and you end up with a really cool ASP page with inefficient insecure SQL for a shoddily designed database embedded all over it.

alaniane
alaniane

SQL is especially important for most business apps since there is usually a database on the backend. The course probably should also teach the student how to optimize sprocs. Learning when to use cursors/triggers/etc and especially when they should not be used.

Tony Hopkinson
Tony Hopkinson

As database design and basic optimisation. Why correlated subqueries are a really bad idea on big tables etc.. The principal of doing as much of the work within the DBMS instead of dragging it all client side and so forth.

Justin James
Justin James

Yup, I already have those in the pipeline for next week's post! :) Te idea is to educate someone to be a well rounded, complete programmer. That's why I include basic networking and OS stuff, a programmer who does not understand OS or networking basics will not be of maximum effectiveness, particularly when troubleshooting. J.Ja

Justin James
Justin James

I like the idea of maybe submitting it to IEEE! I have that link saved to my desktop, BTW, along with the PDF of their CS cirriculum. Thanks! J.Ja

jmgarvin
jmgarvin

I think this is a great start and I'm pretty sure IEEE would be on board (*shudder*...on board...what's happening to me) with something like this

sepreece
sepreece

Learning an assembler is fine (and makes understanding compiler optimization a lot easier), but to be really good at development, you need to have some understanding of the way computers work. Otherwise, synchronization, caching, and other important concerns will make no sense. I also strongly second the need for security as a pervasive concern.

Justin James
Justin James

I actually already have Assembler slated for "Semester 5". I am also going to have at least one class on security, and another on debugging. :) J.Ja

Wayne M.
Wayne M.

I'd include course work on testing, debugging, using a debugger, and performance tuning. These are often far more time consuming than actually writing programs, but most training is ad hoc and via word of mouth.

Wayne M.
Wayne M.

Although Binary, Hex, Assembly, and C data structures were useful when I started programming, I do not think they are still necessary for a basic programming course. With most modern languages and common software applications, this knowledge is about as useful as sliderule skills in today's world. Few programmers today will work close enough to the hardware to be concerned with assembly, bit level masks, and binary operations. With commonly available classes and libraries for collections, I would strangle a programmer who wrote something using a linked list rather than a collection class. It might be useful to have a specialization track for those interested in embedded development that covers these things, but I do not think they add value to a general programming education.

philr
philr

Other basics. How to factorise a problem into discrete pieces that when combined tell a story, together with conceptual modelling as a means to identify the key ideas to be supported by a system. An introduction into the different classes of program such as: scientific, engineering, embedded real-time, operating systems, device drivers, data processing, simulation, web programs, games etc. while covering the sorts of issues that each branch has to cope with together with some history of the development of each branch of computing. The ideas behind the use of meta modelling and meta data and the contribution these make to solving some of the larger problems faced by systems architects and developers in the context of large systems. Finally for business data processing: the basics of business process management and business process modelling. Data processing is meaningless, or sub-optimal at best,if not put within such a context. In otherwords I subscribe to the view that we should be able to respond to the "WHY?" question to a reasonable depth of questioning in order to be able to claim that we have understanding and are educated.

alaniane
alaniane

Learning a little bit about Assembly language would help a student understand hex/binary and computer architecture. Assembly shows how data is moved in and out of registers and how the various flags are used. They would not have to learn all intricacies of the language, but knowing a little about the language would help them understand the basics (I know it has helped me tremendously). P.S. I should have read the comment below before replying since this just basically repeats the info given.

Justin James
Justin James

... to have forgotten hex & binary! Don't forget, I ahve a second half of this coming next week, and I'm planning to put some teamwork stuff in there, since that is critical to the education of a "programmer". J.Ja

Tony Hopkinson
Tony Hopkinson

Sometimes comments are the only option. Assembler for instance. Sometimes they are the only option becauuse of third parties, time pressures, risks... What they should never be is the first option. That leaves dunderhead code like int i; // the number of invoices or just as bad in my opinion int numberofinvoices; // the number of invoices I was thinking of comments more as annotation than documentation.

Tell It Like I See It
Tell It Like I See It

One environment I worked in a long time ago, using Clipper (okay, that dates me) used comments relatively extensively. One of the ways we used them was to embed a comment at the beginning of the source file about who made changes to the file and when. This helped tremendously for figuring out when a certain change was made. You could then go back to that person who made the change and ask for more detailed explanation of why they made the change, the reasoning behind the change, etc. Of course, everyone on the team used the same editor that we built a "comment" macro for -- just hit a key combo, fill in the pop-ups and the comment is done. We even had standards that these change comments are dated and you don't delete comments made less than x-time ago. Any comment made prior to that time was fair game to delete. Personally, I found this annoying at first. However, I came to appreciate knowing who made the change and when. It helped a LOT in certain cases where we had one project come across a desk to modify the program in a certain way; then 6 months later we had a project to basically undo the first project. These comments helped us realize this was happening. It pointed out the need for a totally different solution than either project really described. I'd hardly call that a failure. :)

Tony Hopkinson
Tony Hopkinson

I'm one of those people who feels that a comment is a failure.. :D

Justin James
Justin James

Recusion is, I agree, insanely beautiful and elegant. I am always looking for a place to slip it into a program. Yet, I never find a place where it is appropriate, other than walking a tree. It's like owning a Matisse original, but it is too big for any of the walls in my house. J.Ja

Tony Hopkinson
Tony Hopkinson

could possibly be lived with. The fact that it doesn't come across well in code, that it's a total git to debug and next to impossibile to sensibly extend are more of a concern. Saw one routine to find a node in an xml document, which would be a classic use of xml. Except it had four exit conditions, two of which passed state back to the caller. Psychotic muppet on crack code...

alaniane
alaniane

my program to recursively generate fibonacci numbers is useless in the business world. I thought filling up the program stack was the most efficient use of memory.

jslarochelle
jslarochelle

A good industrial strength library will almost always use non-recursive version of the algorithm shown in school in recursive form. This is still true when working with the larger stacks available when doing 32 bits programming. JS

Tony Hopkinson
Tony Hopkinson

between programing theory and programming practice is the use of recursion. Theorists love it, people like us who have to achieve something in the real world shun it 99/ 100. The best thing to teach a practical programmer about recursion is how and why to not do it if at all possible. Or at the very least situations where Beast bursts out of Beauty and craps all over your solution.

Justin James
Justin James

That is why I am trying to cover a wide range of topics. Relatively few programmers that I have met work on projects large enough where they get to work on only one area of expertise. For example, one of my specialties is regex's (I had a project ages ago doing screen scraping), but regex's are useful for anyone doing data validation. J.Ja

Tony Hopkinson
Tony Hopkinson

you work is already set up, not knowing enough about it to spot where it is going to cause you problems will leave you with egg on your face. Sometimes you can't change the environment, some times a little tweak, can make a world of difference. If you specialise in X, then you are f'ing useless at y and z. Go with Woodrow Wilson Smith on this one. "Specialisation is for insects".

alaniane
alaniane

I was hired to "just code" in VB for a company. The projects were supposed to be well defined so that I just had to write the code. In reality, I had to design the database tables, write the SQL procs, layout the reports, gather user requirements, test the app, optimize the database, and do a little bit of VB coding. Fortunately, I was able to adapt and keep the job. If I had not previously learned about SQL and database design, it would have been extremely hard to have accomplished what they expected.

oz penguin
oz penguin

it is a tough media to try and be clear and concise, but I think we now understand each other better. Yes, it is the "pure SQL" developer that I am referring to. I think that it should be considered an option as 1 year is way too much for a client side developer.

Tony Hopkinson
Tony Hopkinson

Wouldn't call them a necessary evil, they can be a very elegant solution. They should be simple and quick though. Nesting, column difference checks, and validation should be avoided at all costs. One of my favourite uses for them was collecting real information to prototype a report. Things like record a change of status from X to Y in a column Once the customer and I had a clear idea of what was deisred and required, then I'd change the code to do the job and rip the triggers out. I used to use them for out of band comms requests. Trigger to insert a record to flag a required message. Then an other process dealt with the comms and deleted the message request on success. That was SQL server 6, when there was less help for that sort of thing. Saying that it's still an easily maintained and very robust method of doing the job, when cross platorm transactions are not possible or even desired.

Justin James
Justin James

I still cannot figure out of triggers are the worst thing to happen or merely a necesary evil. They are all too often the only way to do something without serious gynmastics, but in the hands of the wrong person, they are deadly. J.Ja

Justin James
Justin James

I think we are actually quite in agreement, but I tend to use the word "DBA" and you are thinking more in terms of a dedicated SQL programmer; it is really just a reflection of the size of the projects we work on. :) Where we are overwhelmingly in agreement is that the person writing the SQL needs to be someone intimatly familiar with the task, DB principles, and the unique particulars of the DB they are working with. We both are envisioning a pure SQL role. To be honest, I think it would probably take a full year of instruction to train such a person. Pure SQL programmers are a class unto themselves. At least half of the coursework I have outlined can be jettisoned for such a programmer, simply because the (mostly) imperitive nature of SQL renders much of my coursework useless. SQL programmers have little need for OS understanding (the SQL engine functions as a VM), memory management, Web design, UI, usability/accessibility, and so on. Much of the more business related functions are still useful, as well as some of the items in Part 2 (posted tonight, http://blogs.techrepublic.com.com/programming-and-development/?p=454). One point to note though, while I agree that my comments were directed towards "Mickey Mouse applications" (I use the term too, rather frequently, oddly enough), I have seen many applications that should *not* be MMA's get coded like one... and MMA's consist of the vast majority of applications, for better or worse. WordPress is a great example. It is a few MMA. A handful of tables, only a few functions, yet it is coded like an MMA and it shows! It needs to be much more scalable, yet it is programmed like a first semster "Hello World" project (a trend that seems to be distressingly common in some really major apps). J.Ja

Wayne M.
Wayne M.

Probably need a special course to teach programming concepts to SQL developers. I've spent too much time going through huge SQL scripts and stored procedures (and some awe inducing triggers) and would like to see some sort of programming structure imposed on SQL.

Tony Hopkinson
Tony Hopkinson

At the application end the guy wants the data they requested in a timely manner, usually out of a test database with ten f'ing records in it. If you are lucky enough to have dedicated SQL developer / DBAs, who can react to the requests from 'client side' developers, all well and good,but genrally it isn't the case, nearly always when some 'pet' project suddnely goes enterprise. Most of the errors we are all referring to are made in ignorance though. Whatever a course does teach, at least they should come out of it knowing that there are issues beyond instantiating a dataset and sponking a bit of SQL in it.

oz penguin
oz penguin

as far as "N-Tiered" goes, we agree. But on the matter of roles, we do not. I have worked as a DBA on multiple large projects. The current one has around 1000 tables and 6000 procedures. A DBA does not write the procedures, they have *programmers* writing SQL code (yes, programmers do write SQL, not the DBA's). These are not necessarily the same programmers that write the client code, but sometimes they are. You made 2 comments about "you may have very well over (or under) engineered it" and "you may want to reconsider your architecture, and maybe your development strategy". These may be true if you think I am talking about some mickey mouse application, but when are talking about MRP, Banking or Insurance systems then the shear scale of these systems requires dedicated SQL developers which are very common in the "real world".

Justin James
Justin James

I am a big beleiver in N-Tiered architecture. As a derivitive of that, I also am a big beleive in N-Tiered *development*. What that means is, for a project big enough where the database requires complex DB work, you do not have your *programmers* writing the data access. You have a DBA writing the data access, as stored procedures. Indeed, from a security perspective, the last thing you want is programmers writing inline code. This is why I do not think that a standard "developer" needs complex SQL knowledge. Let the DBA architect the database and write stored procedures and expose those tuned stored procedures to the programmers. I also must add, if your database design requires complex SQL to access it, you may have very well over (or under) engineered it. I also may note, if you think that what I meant was that programmers do not need to know more than "SELECT * FROM TABLE WHERE lname = 'Smith'" then you misunderstood me. Even a SELECT statement has a lot of operators that can go into it. But again, if your SQL needs bizarrely complex logic, you may want to reconsider your architecture, and maybe your development strategy. J.Ja

oz penguin
oz penguin

if you think understanding "JOINs, SELECT, INSERT, UPDATE, DELETE, agregate functions, GROUP BY, ORDER BY, and WHERE" is 99% of SQL then you are part of the problem of programmers being released to the "real world" and not having a clue about what SQL is really about. I am afraid I have little faith in this part of your "real world" training.

Justin James
Justin James

I actually consider those things "SQL Architecture". There is a convoluted reason in my mind for that, which boils down to the idea that unless you understand the build place and how the SQL server will execute your command, you cannot optimize. Let's face it, SQL has a limited vocabulary, it is not like, say, Perl, where you have 500 ways of doing the same thing. As a result, many of your common SQL performcne degradation occurs in things like JOINing two huge tables first, then *then* applying a WHERE clause, instead of filtering each table first and then doing the JOIN. Also, many bad SQL statements are derived from inadequete or poorly designed databases. So in my mind, the performance end of SQL is very closely related to architecture. If tons or cursors and/or temp tables are needed, chances are the DB design is forcing that decision (or making it seem to be the only way to do something). But no worries, SQL performance will be included next week! J.Ja

alaniane
alaniane

Much of the database work that I do is optimizing SQL written by other programmers. You have to know when to use certain constructs in SQL and when not use them. One proc written by a programmer took over 13 seconds to execute with minimal data (about 5 to 10 thousand rows). I was able to get the proc done to under 1 second. The problem was that the programmer relied heavily upon cursors and direct select statements. He had strung together several select statements that had similiar inner and outer joins to get his tables. I got rid of the excessive joins by creating a temp table and then joining it in the different select statements. So, instead of running the same joins five or six times, I ran them only once. That simple move shaved off over 80% of the execution time of the proc. Further tweaking reduced its runtime to under a second. So, learning SQL should not be just how to write SELECT statements and how to join tables, it should also include how to optimize procs and statements. The student should beaware of the fact that there is more than one way to accomplish the task and how to choose the most effective way to do it. They also need to know how to profile procs/cursors and etc. For example, in the above example a temp table proved a better way to write the proc; however, in another case the temp table maybe a lousy way of implementing it.

Justin James
Justin James

Personally, I think it should take no more than 2 - 3 weeks to teach 99% of the SQL anyone will ever need, in terms of syntax and such. I think that the majority of prgammers rarely exceed JOINs, SELECT, INSERT, UPDATE, DELETE, agregate functions, GROUP BY, ORDER BY, and WHERE. Heck, most coders I know barely know what HAVING is for. Now, that being said, even with that limited "vocabularly", a lot of damage can be done. In next week's post, you will be seeing more DB architecture type classes. J.Ja

Justin James
Justin James

That just means that you are close enough to management or interact with them enough to pick up some of their lingo... also means that you are paying attention when they speak. All good things! My favorite is "let's take this offline" when we're in a meeting. Well, since it is face-to-face, aren't we *already* "offline"? J.Ja

mendtodd
mendtodd

If a "developer" can't figure out the difference between an integer & a string, a primitve vs a class, or case sensitivity (in any language) they need to find a new career choice.

Justin James
Justin James

I now ask "what is the difference between 'equality' and 'equivalency'?" during the technical part of interviewing job candidates, for the same reason. The problem are folks born and raised on auto-casting languages. For example: Dim i As Integer Dim s As String i = 1 s = "1" if i = s then 'True end if will evaluate to "True" in VB.Net. However... int i; string s; i = 1; s = "1"; if (i == s) { //True } will throw a type mismatch error in C/C++/Java/C#/etc. Fun world, isn't it? J.Ja PS - I think that may be the first time in years I tried writing even a smidgen of any of those langugages (C/C++/Java/C#), so please forgive any mistakes!

Justin James
Justin James

... is two fold. First, most development on *Nix is with languages very similar to C/C++ (if not actually C/C++). The second is that the ideas are extremely, extremely useful, even if the structures themselves are not. For example, when writing a scalable enterprise app, understanding of queues and such is helpful. Knowing how to walk a tree is important to someone working with XML. And understanding graphs can be a huge help when working on things like search technologies that are better than a bunch of LIKE operators within WHERE clauses. It really falls under not re-inventing the wheel. A lot of those techniques that we do not have to use anymore still contain valuable lessons for today's tasks. J.Ja

Wayne M.
Wayne M.

With OO languages, I am not sure data structure declarations are still applicable knowledge for most programmers. Rather than organizing the data in a structure one just includes them in a class. Furthermore, one is likely to be including references to classes rather than raw data elements. I also think it is highly doubtful that anyone would want to write classes with embedded linked list pointers rather than using a collection class. There was a time when I would write a double linked list at the drop of a hat, but that time has past and I would not want to see any of my current developers ever writing a linked list.

Tony Hopkinson
Tony Hopkinson

high level languages :D I'm not sure I'd go as far as assembly but representation and basic boolean algebra definitley !A && !B = !(A || B) for instance. Or test for an odd number... BCD for serious math. It's a good foundation to build on, otherwise you end up with highly educated morons.

Wayne M.
Wayne M.

I am not sure that teaching Assembler, especially the Intel 80x86 assembler that would most likely be available to students, is the most effecitve way for a student to learn the difference between 1 and '1'. In fact, I do not think there is any difference in learning the difference in assembler or in any higher level language. Learning assembler involves learning a lot of information that the majority of programmers will never need to use in their entire careers - learning the details of which registers can do which manipulations, the register pairings in the Intel architecture, pushing registers and variable space onto a stack, initializing a stack, declaring a heap, interrupt vector tables and handling, how to write basic evaluations, branches, and loops. I've developed in many assemblers over the years, but I feel most developers really do not need any knowledge of this level of detail to do their work nor does knwoledge of assembler really aid in the understanding of issues created by higher level language constructs and libraries such as semaphores, threads, memory management, and garbage collection. Neither does knowledge of assembler aid in learning good coding style and practices.

Tony Hopkinson
Tony Hopkinson

overflow on a signed integer, I know a guy who struggled with that for five hours before he plucked up the courage to ask. Learning how to ask and asking the right questions would be a good addition to the course. Somwe people who post questions here could take it. :D Would stop all those informative It's broke, can I fix it queries.

Tell It Like I See It
Tell It Like I See It

Although not so much recently, I have come across "developers" who simply cannot understand that "1" (string) is not the same as 1 (integer). I ususally got eye rolling and comments like "a 1 is a 1 is a 1". These same people also tend to have problems with the fact that "A" is not the same as "a". In my opinion, having Assembler (or something similar) really gets these differences across in a way that few things can. It may be okay for a web photoshop-type person to not understand these concepts, but a developer who works with code should. Given that I haven't seen this recently maybe (I hope) most of these people were trying to do programming "for the money" when it was really hot and have now moved on to other fields where they don't need to know this depth.

Tony Hopkinson
Tony Hopkinson

When they needed it, things got messy.... Got to have Truth Tables and boolean algebra, to cover that you might as throw in the hex and stuff. Anyone who can't get a C Data structure should be flunked immediately, wasting their time and everybody elses. You watched one of these puddings, struggle with reference and value types? Sir, sir what's a stack ? If, more like when, we hit the hardware wall and need to start writing optimised code on a regular basis again, the poor numpties will have to unleaarn a lot, if we don't give them the basics.

Tony Hopkinson
Tony Hopkinson

A shining example of impractical academic drivel.

philr
philr

I am too far from our local uni faculties these days to comment on the teaching side of things. However, I agree strongly about the need expert rules for model checking and for the making the conscious effort to develop the same. (PDCA at the methods level, I suppose) I have had the misfortune of having some dreadful models being handed over by top teams from big consultancies. One healthcare model covered the area of medical records tolerably but ommitted all notions of feedback/control that are essential in hypothesis testing, and totally avoided any notion of costing. Re methodolgy: it gets a bad rap. FWIW if the owners of the business system are agile in their approach to the design of the business then agile methods are fine for developing computer systems, otherwise you will get the wrong system sooner. ;-) This might be a good thing i.e. better than the wrong system later?

Tony Hopkinson
Tony Hopkinson

if at all though. Have you considered how tightly coupled your design is. Response, but it's got meta data in it ! It's like the twit who claims to have modeled something simply because they have diagrammed it in .... Is it a good model ? That's the bit that seems to go west. Quicly followed by a practical implementable and maintainable one. Methodology substituting for design !

philr
philr

The concepts of coupling and cohesion are invaluable but these extend into the business too, and beyond into any area where the notion of function applies. Chip design, legislation and mechanical engineering spring to mind. However, there are always trade-offs. Understanding the principles helps clarify these. The same notions apply to meta data and the processes creating them. Methodologies often share techniques and their corresponding meta models. I did not mention diagrams. However, I do find them very useful.

Justin James
Justin James

I really love that idea, and I considered it, but I am really not sure if the room is there for it. To compensate, and get maximum value out of it, I am trying to include historically relevant, but less mainstream techniques and langugages where appropriate, in order to give the students hands-on experience the the lessons of the past (or even currently useful but not popular things). After all, knowing that the wheel has already been invented keeps you from reinventing it. :) J.Ja

Tony Hopkinson
Tony Hopkinson

to an MBA course where they belong. Languages/Methodologies are the way we express our skill, if they don't get and aren't concerned by how those choices constrain how we express ourselves they aren't and never will be programmers.

alaniane
alaniane

Maybe, including a general history course on programming languages and methodologies. Showing how each generation built upon the previous generation. Like showing how machine language programming led to assembler and then how assembler led to higher-level languages like Cobol and Fortran and so on. Also, a comparison of the different design methodologies and when each is useful to use. Of course, this material could also be included in the other courses. I guess the key to presenting it would be to make it interesting and not just a rundown monotonous review of history.

Tony Hopkinson
Tony Hopkinson

problems and solutions, fine. Far too often the methodology is seen as way o ssolving the problem which is so wrong it's incredible. Meta data for instance is a lovely technique for decoupling a design. If you are taught why coupling is bad and methods to reduce it, the utility will be obvious, like the mistakes we often see when it's used without that understanding. If coupling, cohesion, and encapsulation why they came about aren't taught, no amount of pictures is going to make the situation clearer.

Tony Hopkinson
Tony Hopkinson

basic boolean operations expressed in truth tables. Then you can start looking at Karnaugh mapping, simplifications, boolean algrebra... Pscaal would be my pick as a starting language, but I agree procedural should be taught before OO.

kaundish
kaundish

Best way to geting started in programming is to teach the truth tables.Then it is better to start from C rather than directly going in to OO concepts.

alaniane
alaniane

I have seen a paper in which 32 bit protected mode assembly is written using NASM. A lot of syntax is similar to C. Another possibility would be to have students design and use a simple assembler like language. I saw one C book that created a SML (simple machine language) program. The language could be adopted to show how registers and flags are used. Maybe the language could even be extended to show how interrupts and memory addressing works. Debug could also be used to show students how different registers are affected.

philr
philr

The history of computing has been one of factorising out various concerns and of developing tools that support our generalisations of the problem space. I had to key in a boot-strap loader using the front panel keys of the computer. I.E. I entered machine code into the machine in order to load my assembled program. Using assembler taught me a great deal. One caution: I would teach a simple assembler to 101 students. Modern assmblers can be fiendishly complicated and too advanced. I saw some operating system assembler for a mainframe operating system once. It was very difficult to penetrate.

Tony Hopkinson
Tony Hopkinson

Things like polling, and interupts. Encoding (BCD, gray code, ascii) What a stack is offsets, indexed lists Representations. Reverse Polish Notation Truth Tables Karnaugh Mapping Losts of the real baiscs of turning your idea in to a program. The big thing to learn is none of this stuff has gone away, it's just hidden inside a black box.

Editor's Picks