Fog Creek Software
Discussion Board

Learning Microsoft platforms

Hi Joel:

I am an experienced (close to 15 years) developer with good background in cs, but have been using only Unix till now. I know Unix in and out and I find it comfortable to use it. I can quickly do what I want using emacs (I can do in emacs what most people would use awk for) or languages like shell or python.

If someone were to ask me how they can learn Unix, I can give them decent advice: learning scripting, OS, various libraries, and philosophy of Unix way and sample programs to study and tools to learn and master. I can advise them which tools have longevity and which choices are isomorphic. I can tell them CLI, GUI, and web programming and what choices usually are the simplest and easy to do.

Is there similar advice you can give me re: learning windows? I am intimidated by the large tomes (I like K&R style books). I tried using the .NET IDE and I did not know enough about the tool to use it effectively.  I want to put together solutions using windows.

What I would like is a sort of "intelligent person's guide to Windows development" -- a trail of books to read, programs to study, and sites to follow. I would like to know the basics that I can learn that can stay with me for long time, instead of some "tool/technology du jour".

Appreciate your time in answering this question.

Unix guy
Tuesday, February 24, 2004

That's a really hard question, because it depends on what kinds of things you want to do. Unix is a programming culture and you can't be as good at Unix stuff as you are without a lot of programming knowledge and programming tools. Windows is not a programming culture... only a tiny percentage of users ever program. But I'm sure you don't need me to tell you "well, first learn Word, then Excel, then some painting programs..."

So... what are your goals? You said "put together solutions" -- to what kinds of problems?

Joel Spolsky
Fog Creek Software
Wednesday, February 25, 2004

Bah! I'd swap places with Unig guy in a minute!

Wednesday, February 25, 2004

If we're talking programming, I'd start with a suitable triumvirate of books:

Programming Windows, 5th ed (Petzold)
Programming Applications for Microsoft Windows, 4th ed (Richter)
Programming Server-Side Applications for Microsoft Windows (Richter & Clark)

(all MS Press)

The first teaches GUI coding; the second teaches the kernel programming model as it applies to all processes; the third deals with things like asynchronous I/O, services, event logging and performance monitoring.

You'll probably also find Inside Windows 2000 (Solomon & Russinovich, MS Press) useful from a technical perspective.

In terms of UI, you should study Explorer, Word and other Office tools, and Visual Studio .NET. Like it or not, Windows users expect their programs to function largely like these tools.

Mike Dimmick
Wednesday, February 25, 2004

The problem is that I am not sure what can be done with Windows, it all looks magic to me. But, I will tell you what I do with Unix and would like to do with windows (at least equivalent things).

1. I can do scripting to solve quick problems with text, and email flow.  I can glue together applications like sendmail, text processing systems, and databases.

2. I can develop largish applications that rely on libraries available in Unix. I know how to make them run long. If it is misbehaving, I can peek into the application while it is running. I can replace standard libs with my own to debug better.

3. I can use emacs well. I pretty much can do whatever needed to be done - edit files, develop code, debug code, run code etc. I can do all the developer things -- navigate the code, write my elisp macros.

4. I understand the OS tools sufficiently. I know how to troubleshoot issues, and know what programs do what. I did not do kernel coding because I did not need to -- I am sure I can do little bit of it if I need to.

5. I know apache and studied it well. I know the patterns of various programs. In particular extensibility of programs through builtin scripting is something I did quite a bit.

6. I can put together websites well with Apache + php or Tomcat + jsp (Fortunately, they are the same in windows as well).

7. I know what to trust and what not to trust in the available programs. All programs are supposed to help you, but only some do what you want.

I know I cannot become good in Windows immediately. But, I do not mind learning how to use Word effectively (like I can do with emacs -- for example, you know you can automate emacs from lisp from command line?) I am using cygwin in windows now -- it keeps me cocooned in Unix mode in windows!

Why do I want to learn windows? I like Windows -- .NET looks fun, and lot of my clients want to use both Windows and Unix. Also, I spend so much time in Windows as a user, it is silly not to know it deeply. I am a techie and I like to be in control.

Unix guy
Wednesday, February 25, 2004

I forgot to add -- these are the kind of applications I am looking to put together:

1. Develop GUI based a database centric application that does intelligent semistructured data analysis. Integrate with Excel.

2. Develop business level logic in a library (say for example an employee benifits system) that is usable from web as well as rich client.

3. Develop services that can monitor applications and populate a database -- memory usage, number of messages served.

4. Take an existing system that does telecom billing and reengineer it to make it scalable (by reducing resource contention etc).

These are the samples of applications I done recently and I would like to do in windows eventually. I presume there is nothing "unixy" about these.

Unix guy
Wednesday, February 25, 2004

OK. Well, there are a lot of different paths to Windows and a lot of different permutations of skill-sets that a Windows user might have, need, or want. There's no one-true-way.

One possible learning path:
1. Excel
2. Excel Macros (VBA)
3. Access Databases and Access SQL
4. SQL Server Administration -- learn how to "upsize" Access (single file database) solutions into SQL Server (client server database) solutions
5. C#.Net WinForms front end / SQL Server Back End
6. ASP.Net

Now you can build just about any kind of Excel add-in for data analysis, any kind of WYSIWYG GUI app with a database back end, and any kind of web app with a database back end.

Joel Spolsky
Fog Creek Software
Wednesday, February 25, 2004

Thanks joel, for pruning the umpteen choices. That is exactly what I am looking for. Now, if you can recommend the books and code that I can read, I can set myself on the path.

Thanks for suggestions from others. I will read those books too. Perhaps I will take a subscription from MSDN from my company.

Unix guy
Wednesday, February 25, 2004

I liked this book on .NET:

Microsoft .NET for Programmers
by Fergal Grimes

It covers a bunch of different aspects of .NET and C#

From there you can go onto other specialties:

--> .NET fundamentals:

Programming .NET Components
by Juval Lowy

--> .NET databases

Pragmatic ADO.NET: Data Access for the Internet World
by Shawn Wildermuth


Essential ASP.NET With Examples in C#
by Fritz Onion

--> Windows Forms

Windows Forms Programming in C#
by Chris Sells

You can also take a look at O'Reilly's new site dedicated to Windows development:

I'd also recommend  the Safari Bookshelf.  For just a few dollars a month you can view up to 10 books from a large selection. 

Wednesday, February 25, 2004

Oh another good book that I recommend on .NET is:

Applied Microsoft .NET Framework Programming
by Jeffrey Richter

It's about the lowest level I would recommend your average .NET developer go.

I don't think going this low is neccessary:

Essential .NET, Volume I: The Common Language Runtime
by Don Box

Of course the ratings/reviews for the book say otherwise.  I think most likely they are people who want to post their name as "being in Don Box's secret circle" for all to view.  Don't get me wrong, Don Box is a smart guy, but the book isn't "Essential" reading for your average .NET programmer creating enterprise applications.

Another, book (although non .NET) I'd recommend is:

Patterns of Enterprise Application Architecture
by Martin Fowler

Wednesday, February 25, 2004

I've often wished that people would write more books in the format: "X for Y People", where X and Y are two technologies in the same area, for example Windows and Unix or DB/2 and Oracle or Java and C#.

And in these types of books, how to do each task in "X" would be explained using comparisions to your existing knowledge in "Y".

Now, I understand why they don't write books like this (it makes your audience even more narrow), but still, it would be nice.

Bill Tomlinson
Wednesday, February 25, 2004

Hey, we're all programmers here, we know that if there's "W for X", and "X for Y" and "Y for Z" then that's equivalent to one "W for Z" book.  Right?

Richard Platel
Wednesday, February 25, 2004

So if we have this book "Artificial Inteligence for programmers" and this other book "Programming for MBAs" we can mix it all and have a compendium called "Artificial Intelligence for MBAs" ?

mmh.. I don't think so ;-)

your address is never revealed
Thursday, February 26, 2004

*  Recent Topics

*  Fog Creek Home