MacBook, defective by design banner

title:
Put the knife down and take a green herb, dude.


descrip:

One feller's views on the state of everyday computer science & its application (and now, OTHER STUFF) who isn't rich enough to shell out for www.myfreakinfirst-andlast-name.com

Using 89% of the same design the blog had in 2001.

FOR ENTERTAINMENT PURPOSES ONLY!!!
Back-up your data and, when you bike, always wear white.

As an Amazon Associate, I earn from qualifying purchases. Affiliate links in green.

x

MarkUpDown is the best Markdown editor for professionals on Windows 10.

It includes two-pane live preview, in-app uploads to imgur for image hosting, and MultiMarkdown table support.

Features you won't find anywhere else include...

You've wasted more than $15 of your time looking for a great Markdown editor.

Stop looking. MarkUpDown is the app you're looking for.

Learn more or head over to the 'Store now!

Thursday, March 01, 2018

Oh google. Your raw source makes me something something.

Sad source

Why is this in the page itself? Why do you need so much source to display your page? What ever happened to humans writing html code?

I know I sound like an assembly programmer in the land of OO, but it still makes me sad. ;^)

Labels: , , , , ,


posted by ruffin at 3/01/2018 07:39:00 PM
Monday, February 19, 2018

If your architect hasn't written a tutorial -- not a cursory howto, but a tutorial -- you don't have an architect.

What does a tutorial look like? The canonical example for C# web apps, though now a bit long in the tooth, is NerdDinner:

NerdDinner Tutorial

The best way to learn a new framework is to build something with it. This tutorial walks through how to build a small, but complete, application using ASP.NET MVC, and introduces some of the core concepts behind it.

The application we are going to build is called "NerdDinner". NerdDinner provides an easy way for people to find and organize dinners online...

There's not only a nicely written walkthrough, but documented code and a live, running example.

If your architect hasn't taken the time to articulate their vision thoroughly, in plain, if expert-specific, [language of your locale], there's not much hope for your coders. Your codebase will necessarily be an unmaintainable cyborg (a topic I'm [not] surprised to find I've been ranting about since 2002).

The best job security is none. You've set your stage so well any competent programmer could come in and take over, getting up to speed incredibly quickly.

Those coders who work to ensure they're the most easily replaced are absolutely irreplaceable.

Labels: , , ,


posted by ruffin at 2/19/2018 10:02:00 AM
Tuesday, May 24, 2016

Saw a question on StackOverflow this morning that mentioned ESLint was merging with another JavaScript linter, JSCS, or at least their teams were.

I added a quick comment:

An opinion question as written (the one you link to does a good job hitting a grey area: "Show me the way code is handled differently in each"), but here's an interesting, related tidbit: It appears ESLint isn't merging with so much as aqui-volunteering (?) JSCS's team.

... the first goal of the combined ESLint/JSCS team is to make the transition to ESLint easy for JSCS users.

They've planned to add features from JSCS that ESLint doesn't have now, but it seems the JSCS codebase isn't merging with ESLint, but is likely going to wither on the vine. Makes sense, but still interesting!

Aside: I like aqui-volunteering. See what I did there? (Sorry.)

One comment from the ESLint project's announcement about the merger bugged me, however...

With the new combined ESLint/JSCS team, you can expect a lot more from ESLint in the future. We now have some of the brightest people in the world working on making ESLint the best possible tool for JavaScript syntax analysis. Iโ€™m personally very excited about ESLintโ€™s future and tackling some of the more difficult problems like making autofix possible for every rule and incorporating type information into our analysis. We can go a lot further, faster, when weโ€™re all working on the same tool. [emph mine]

Ah, the mythical volunteer month strikes again. If only all that were true.

I still don't know what more coders really buys you. If you take the time to create clearly defined interfaces between every chunk of work, you can gain nearly 2x production from double the coders. And I think there's something to careful use of pair programming, which provides three sets of advantages:

  1. Great architectural review.
  2. Bug spotting that ids lots of low-hanging fruit/duh moments.
  3. Shared familiarity with code.

The third is one of the most important. Forcing coders to share what they were doing and thinking with someone else gives you the first and second, but also means that your cyborg -- and all code is full of cyborgs, some strange melding of code and the style of the person(s) writing it -- is more spread out, reducing the impact whenever some of the meatware decides to move on.

But does it work here?

But when it comes to great JavaScript linting, I'm not sure more is better. You've still got one guy working on a linter as a side project that, afaict, is every bit as useful, if not moreso, in standardizing code and enforcing best practices than the work of the 371 (to date) at ESLint. (In case you're new to the blog, that's JSLint.)

I mean, tell me which code you'd rather maintain:

ESLint code at github

or...

jslint codebase

And I should point out the JSLint repo has no folders, and you really only need that single jslint.js file. Occam's code, folk. Make code so simple to use that it'd make William proud. ;^)

I like Nicholas at ESLint. Seems like a really good guy -- and ESLint seems like a good, well thought-out tool. It just seems like overkill -- harder to maintain, more to learn to use proficiently, more likely to change from installation to installation, which means less standardized code -- and there's nothing that bugs me like over-engineering. One example: Autofixing? Why not just use Typescript from the start? Seems too much for a linter. Teach me how to write good code. Don't automate the fishing.

Here's a less biased example: Looks how excited this guy on SO is that ESLint makes it exceptionally easy to create new rules.. To me, that's cringeworthy -- No, no no, I don't want everyone on the team creating new rules! But if quickly creating custom rules is your use case, well, ESLint might be what you're looking to find.

(Though, admittedly, I have suggested to others that they hack JSLint directly, since it's just JavaScript, which might be even worse.)

Anyhow, just an interesting [to me] cultural contrast between two popular and useful linting projects.

Labels: , , , ,


posted by ruffin at 5/24/2016 09:58:00 AM
Friday, June 26, 2015

A good, thought-provoking post from Actively Lazy today:

I think we massively underestimate the cost of coordination and communication when building software.

That's true. Full stop. This, the communication price, is exactly why folks are still quoting The Mythical Man-Month. Communication makes [hu]man-months mythical.

But what we do with this discovery is what's really important. It's easy to find one solution and think it's the only solution, as I believe Actively Lazy has done. Let's explore two.


Pair Programming

Here's Mr. Green's (Actively Lazy's author's) take home (emphasis mine):

From the outside its very easy to miss: a quick 5 minute conversation laden with jargon. And yetโ€ฆ this is where the magic happens: this is where the design comes from. But if that 5 minute conversation interrupted someoneโ€™s work, the next 45 minutes could be lost while they try and reload into memory what they were working on. Pile up a few of these interruptions in your day, and no wonder it feels like youโ€™re swimming upstream. [anybody else hear Joel Spolsky now? -mfn]

Clearly, what we should have been doing but werenโ€™t was pairing. That way there would only have been one narrative thread. One sequence of ideas being applied at a time. ... There is no cost of interruption when youโ€™re both already there, immersed in the problem. ...

So in fact: two people can be more productive than one. Two people pairing is definitely better than one person working on their own. ... Itโ€™s all based on a false assumption: that two people working on different machines are twice as productive as one person working alone. Once you realise that this assumption is fundamentally flawed, the โ€œcostโ€ of pairing evaporates. Instead pairing removes the cost of coordination between two developers: no interruptions, no divergent ideas, no merge conflicts.

My quoting makes the argument a little worse; you really should read the entire post in context. But you get the picture. He's arguing that pair programming pays the "coordination and communication" costs as-you-go so that you don't have to pay the piper in spades, to mix some metaphors, later.


Pair programming trades function for quality

When you work in pairs, you create less working code that is higher quality. This is nearly a truism. If you're somewhere code review's benefits aren't appreciated, run. I'm not saying you should require or even use a lot of code review -- my jury's still deliberating on its best use -- but reviewed code is of higher quality than code that isn't.

  • Best practices
    • Test Driven Development
    • Linted code
    • Reviewed code
  • Efficiency/Scalability
  • Normalization/smart reuse
  • Standardization
  • Proper error handling

At the same time, that "high quality code" may not necessarily do the job better-qua-[characteristic X]. Just to get your started, here are a couple of common Characteristic Xs (feels like we're making Powerpuff Girls)[1]:

  • Be delivered on time (this is the biggest argument contra-quality
  • Be significantly faster (when n=1, does the fact some schmoe used a bubble-sort matter?)

This is why iteration is such a catch-phrase for coding (though also see its abuse, here).[2] Get 'er done, then, if you have time to notice (or are forced to notice by poor performance), but only if you have time to notice, make it better.


Quality vs. Functionality

So is pair programming the answer to removing communication problems? Sort of. Depends on why you think you need to communicate! One key here is that Green only has two developers:

Me and one other developer have been working on a new, greenfield project.

If you only have two devs, of course pair programming kills the problem of deferred communication. But if you have 40 devs, you've now got 20 pairs that could need to sync back up.

Twenty pairs is still much, much better than 40 individuals. Twenty pairs should also be much, much better than 20 individuals. The same way letting someone use your alpha version for 15 minutes uncovers bugs simply because they have a different mental model than yours, letting another strong developer take a look at your code will unearth some low hanging fruit (man, I'm mixing metaphors today. Uncover some barely buried tubers?) quickly. And even that single filter means your code will require less change to integrate with the rest of the team.

The key take-home is that pair programming makes for higher quality software, not more of it. There's more than a single metric for evaluating software's worth.

The other side of code is functionality, often reduced to the reasonably useful metric, lines of code (loc).

Aside: If used correctly, lines of code can give you a general idea of how productive your devs have been. Though insert the usual caveats:

  • loc is really only useful comparing a specific dev's output to her or his own
  • a stark increase in loc for a dev often means they're pumping out code too fast, and feel stressed
  • brilliant solutions don't always produce lots of code; usually it's the reverse

And there's a performance bar that tells us if code is good enough. That is, pair programmed code may be higher quality, but it may also not be significantly faster or use significantly less memory, etc. The biggest problem in evaluating how much quality you need is that often you don't know how significant a bad LINQ statement might be until you run it at scale.

I think the suggestion is that you have to bias your development culture so that it always strives for high quality with respect to best practices. You want good scalability? Don't overuse ORMs. Don't push logic into the client. Write good SQL. Take time to plan your schema. But I don't know that pair programming, sacrificing half your speed for code quality, is necessary if you have this high-quality culture instilled with a team of well-hired developers.

You get the point. The bottom line: Your code is higher quality if it's reviewed for standard practices, errors, and efficiency/scalability first, even if that review time reduces how much functionality you can build. But remember that functionality is why you're in business: you shouldn't sacrifice function for idealistic quality. In other words, you need to discover...


The nasty truth: There is "good enough"

Imperfect code can still provide acceptable functionality. News flash: There is no perfect code. [Most] Any solution is beyond a certain level of complexity is subjective.

That there are many subjective Right Answers to complex problems, and it's precisely because you can only reasonably select one of them that you ask for advice before tackling them. That is, subjectivity is why you design code before coding. Even when you're going to tackle a major problem alone, you "pre-[re]view" with someone else (don't you?!!) your selection from all the different ways you [both] can think of to solve it.

The reason you consult someone else first is because you know the problem you're working on needs an extra helping of quality mixed in with the quantity. You slow down, sacrificing not just your but your teammate's output, to ensure your output's quality. Your know your solution -- or at least its design -- needs a second set of eyes. In a sense, though you may not have touched a keyboard [much], you are already pair programming.

The conflation of these two code metrics -- functionality & quality -- is what provokes Mr. Green to say...

Unwinding a few days, we probably would have got more done with just one person working. That way there would only be one narrative thread through the code, one sequence of refactoring steps at a time.

Wait, what โ€“ say that again: we would have got more done last week if only one person had been working on it.

Sure, one person working alone could bring the code back to a single narrative, but it'd be one person's narrative. You've right back into communication debt. Hopefully it's not as bad as it was before you'd code reviewed with your coworker, but the new communication debt again exists. This single person's progress is another unreviewed revision.

And perhaps that's good enough.


A different lesson: Seperation of concerns

The real key is that you can't have X people, where X is determined by your company's management, working on the same code at the same time without factoring in the communication costs for getting X folk on the same page.

If you don't have time to factor in communication and code review, the new code will be worse in all of those standard ways -- best practices, efficiency, normalization/smart reuse, standardization, error handling. Worse, each person will find themselves coding around or being hamstrung by changes to their narrative made by X-1 other coders. Codebases shared by X devs without coordination is worse than having X coders doing their own thing. You do not get X-times (or "Xx" -- I regret my use of "X" at this point) the work, even if each dev is working on their own seemingly independent story!

To get "Xx" functionality (and that's what the company wants, man. When you feel pressure to go faster, and are considering adding more devs to finish sooner, it's because you want functionality), you have to separate concerns perfectly.

  • You must create interfaces ahead of time, at least one per "communication unit".
  • You must hit these interfaces.
    • Rather, if you change them, you have to change your schedule drastically.
    • You just changed two team's narratives!
  • You must create test cases for these interfaces with realistic values.
  • The interfaces must be natural breaks; they must be truly separate concerns.
    • You can't have any interaction between them.
  • They require an emphasis on defensive code.
    • There can be no unintended interactions between the opposite sides of the interface.

The interface is a contract. And objective contracts (strangely possible in code; it's magic) are the most efficient means of communication for software projects.

Now you're creating functionality as quickly as is possible. And if done correctly, you can get a lot closer to the myth. But there's a huge, obvious downside...


Communication Debt added to your Technical

And remember, if X is large and your stories are done by one person per story, your "communication debt" will be just as huge. You will have technical debt, and you will have a huge learning curve for the new dev if the person working on the code changes. And if the meatware half of the cyborg leaves your company before the knowledge transfer/code review takes place, you're in trouble.

The good news? This debt will be firewalled by the interface. That's as far as the bad can go, if you have smart TDD.

If X is large and your stories are done by two people, the debt will be more than halved, but your functional output could be more than halved as well!

Quality code is hard, (c) 1842.


[1] If you want an example of folks arguing against higher quality code for short-term preference Characteristic X, see the constant complaining about JSLint rules wherever JSLint is used. Let me summarize two-thirds of the answers on the JSLint tag on StackOverflow: "If you don't like rule X, you should use JSHint and turn it off." JSLint is a form of code review that emphasizes a set of "best practices". If you're left to your own devices, you might not always follow them. Following them might not make for better code in every situation, but you will have good, standardized code with fewer errors. JSLinted code is higher quality code, though conforming takes more time than not.

As I've said before, "If I had to inherit legacy code sight unseen, and could only require that it be JSLinted or JSHinted (pick one), I'd pick JSLinted code every time," and that's because it's higher quality.

[2] Hey, look! I've talked about Agile (here regarding documentation) as early as 2004! Three cheers for ourselves!

Labels: , , , ,


posted by ruffin at 6/26/2015 10:20:00 AM
Friday, July 31, 2009

Amazon.com: Customer Discussions: Edward G. Nilges' discussion of Amazon reviews:

Developers in my direct experience have too long been nailed to the cross of an inhouse 'programming language' written by some pompous lawn troll who didn't bother to learn theory.


Exceptionally well said, as usual.

Labels:


posted by ruffin at 7/31/2009 07:35:00 PM
Thursday, April 19, 2007

This quote from the GNU/Hurd description page caught me wondering if there isn't a serious paradox afoot.

Although it is possible to bootstrap the GNU/Hurd system from the sources by cross-compiling and installing the system software and the basic applications, this is a difficult process. It is not recommended that you do this. Instead, you should get a binary distribution of the GNU/Hurd, which comes with all the GNU software precompiled and an installation routine which is easy to use.

Wait, Hurd, the only 100% completely GNU-friendly OS out there is telling you that Hurd's open source is, practically speaking, worthless?

I was pretty hard on Microsoft for doing the same thing, which compels me to be relatively tough again. If the build process is so convoluted as to be impractical, all Hurd has done is substituted a closed society of cyborgs for a dance on the legal intellectual property circuit.

Perhaps we could argue that Microsoft made their "open standard" confusingly intricate intentionally, or at least that they weren't in a position where the .doc format had to be so complicated. Hurd, on the other hand, is an in-progress hack by a bunch of part-timers. Perhaps we should argue that Microsoft is making a profit and is traditionally more interested in closely their intellectual property than opening it for reuse in ways Hurd would never dream.

Still, if GNU wants to show the value of open source and Freedom Software, they need to do a better job ensuring that their mascot, of sorts, is more accessible. If you ask me, with Hurd, the printer's still jammed and nobody can do a thing about it from where they're sitting. Instead of drafting GPL 3 or taking pot shots at Linux's file maintenance system, perhaps GNU should pour that time into making a clean, accessible Hurd.

Labels:


posted by ruffin at 4/19/2007 06:16:00 PM
Monday, December 12, 2005

There are two kinds of programmers. If you believe that, let me also tell you what they are. There are those who program The Right Way, with fully modular, well-commented objects that can be picked up and edited, bug fixed, or expanded by anyone reasonably fluent in the skillset needed to create that sort of code. Then there are those that try their daggum-est to turn into cyborgs, where you have to have the human to understand what's going on with the code. "We can't fire John Doe! Without him the whole place would collapse!"

Strangely, then, the best programmers are those who are confident enough in their abilities that they happily code themselves out of any job security -- and paradoxically, if their manager is worth a rip, thereby secure the same (that being job security, if the attempt at flair was too much, which I fear it was).

This guy, the guy responding and refusing to list the bugs he feels must be fixed before the product is released, is pretty clearly of the second kind.

>As Kim has mentioned, it is unclear what bugs you are referring to.
>There are only a couple of bugs listed in FOR-RELEASE. The bugs in
>emacs-pretest-bug, which are usually minor problems, get fixed at
>about the same rate as they are being reported, i.e. after a few days.
>Maybe the reason you have the idea that bugs aren't being fixed
>because developers sometimes don't send a follow-up email to the list
>when they check their fix into CVS.

I hope soon to have time to recheck the saved mail.
But there are several messages I have posted more than once on
this list, with no response, which will go into FOR-RELEASE
when I get future reminders.

Labels:


posted by ruffin at 12/12/2005 03:23:00 PM
Monday, March 29, 2004



As I've ranted before, I believe, creating a cyborg does not give you ironclad job security, regardless of past perception. People feel better when there are parts of a computer system only they understand, but eventually you'll liable to get a manager worth their salt in there and suddenly those parts that used to require you will be replaced by adequate documentation.

And that's where the fallacy lies for so many people. Look, even with adequate docs you'll still know more about what you do than anyone else. Just remember that your goal should be to do your job well, including getting the position ready for your replacement -- whether you end up moving laterally, up, or away -- not making sure that you still have a job no matter what happens. If you're not able to do your job well, well, start looking for another job. You, and everyone down the line, will be happier for it.

Labels:


posted by ruffin at 3/29/2004 11:43:00 AM
Friday, March 19, 2004



In the latest "Software Development magazine's Agile Modeling newsletter" (don't have the first clue when/why/if I signed up for this email, but it's been interesting so far and I haven't starting trashing yet), Scott Ambert talks about when to and when not to document, using "Agile Modelling" as his context.

Here's what "Agile Modelling" is in brief, taken from his site:

Agile Modeling (AM) is a practice-based methodology for effective modeling and documentation of software-based systems. Simply put, Agile Modeling (AM) is a collection of values, principles, and practices for modeling software that can be applied on a software development project in an effective and light-weight manner.

I'd like to look at three of his points, the first a "when to document" and the next two are "when not to document" (bold is mine):

[A "when to document"]:
--To support communication with an external group.
It isn't always possible to colocate a development team, and it isn't always possible to have project stakeholders available at all times. When you need to work with an external group of people, you need to find ways to communicate with them. Shared documentation is often part of the solution -- along with occasional face-to-face discussions, teleconferencing, e-mail and collaborative tools -- but it should play only a supporting role. Documentation should be a last resort for communicating with an external group, because it's far too easy to misunderstand something that's been written.


[Two examples of "when to not document"]:
-- Your process says to create the document.
Although this isn't a problem with agile software processes, it can be with prescriptive processes.

-- You're specifying work for an internal group.
Documentation is one way to communicate, but it isn't the best. Instead, consider working sessions with the other group or the use of collaborative tools.


Let me clue in the ill-informed: You're always programming for the guy/gal who's going to replace you. Likely you don't who know this person is going to be. You can't assume they're already in your working group. You have to write code that "passes the bus test" ("in case you get hit by a bus tomorrow") -- or, as I like to phrase it, pass the less violent "techno-hermit test" ("in case you go all ludophobic and run for the hills without your laptop tomorrow"). Chances are after any programmer turns in their notice, those two weeks or so won't leave enough time to find a replacement and adequately effect a knowledge transfer. Nor is it very useful to shove the knowledge into an intermediary. It's best to have the code have docs with it as it's being created so that a new schmoe can get that knowledge without the original hacker there -- and it also has a near-magical effect of creating better code as well.

(Aside: I'm not asking for mad docs. You should have exactly as much documentation as necessary for a programmer with equal skills to pick up and understand what's going on in a general sense without looking at the code. This could very well mean just a collection of well written flowerboxes to objects and methods, but could be something a bit nicer, with pix of the interface, etc.)

Although the belief that programmers can be thought of as inhuman, interchangable resources, which is obviously not the case, is too widely held, the best programmers and programming groups do their best to deliver high-quality code and documentation that makes the impossibliity of having interchangable programmers as nearly the case as possible.

So let's sum up. You're always programming for an external group, meaning that documentation can safely -- and should! -- be part of your process. Nothing, and I mean nothing, hurts a project like a developer leaving and the new fellow or gal coming to work on a cyborg with the human-half missing. Except for hiring boneheaded coders in the first (or second) place.

Labels:


posted by ruffin at 3/19/2004 05:02:00 PM
Wednesday, November 05, 2003



If a company can't show you a running version of any app not only that they've developed (and still support) but also that they're developing, don't work there. Heard of daily builds? You need them. You need that overhead in place already to ensure that you've got a mature, robust development process in place.

And if you find yourself someplace that doesn't happen now, start it. It's a lot of overhead, sure, but it's really a requirement for a workplace that's not going to stick you with horrible to handle "legacy" work (eg, "Coder X left the company and the project's yours now." Without the symptoms of a mature coding process evident, you could end up with the dreaded worst case here -- code that Coder X could upgrade in an hour but that'll take you three weeks just to begin to understand. Why does this happen? Coders without processes tend to create cyborgs, not maintainable code. This is due to a number of reasons: laziness, perceived job security (I'm the only one that can do this), lack of skill, etc.)

At any rate, you've been warned.

Labels:


posted by ruffin at 11/05/2003 05:31:00 PM
Thursday, September 26, 2002



I've had a great time closing out my work day the past two evenings reading The Mythical Man-Month by Frederick Brooks. I'm barely into the book at all (usually just take 5-10 minutes to relax after programming burn-out), but so far the lessons related are awfully good ones.

I'd originally shied away from reading this book because it was someone talking about writing the IBM System/360's software. But things obviously haven't changed much in 25-30 years. The talk is, so far, at a high enough level that visions of my current projects jump into my mind when, almost certainly, the author is thinking about his work in the 1970's.

Anyhow, one thing that Brooks points out right from the start is the difference between a "Program" and a "Programming Product". In brief, he says that the garage programmer is making "programs" and software shops are putting out "programming products". The latter is, by definition, something that is easily extented by anyone and is written in a "generalized fashion". It is also well tested with a variety of test cases. He guesses that this takes about three times as long to create as a simple program. I think that's a little short, but anyhow...

It's interesting to look back over the projects with which I've been involved over the last several years and notice which are programs and which are true programming products. (Brooks has another two types of end results for programming, but I'm going to stick to two for the time being.)

Most of what goes on where I work is the creation of simple programs. People get a task, in the past a "one-programmer-per-programming-task" sorta deal, and they went off and made it. When that programmer left, you were left with a sort of "cyborg without the cy". Nobody could quickly and easily take over the program because it hadn't been written in a general fashion for anyone to extend. There were few "objects" that could be picked up and extended; instead you had to get intimately invovled with the legacy code to add significant functionality (or to figure out the cause of a bug).

He's also gone on to show how adding more workers to a project simply doesn't work in a programming task, because of something quite similar. If you add someone to the mix before you're done with a programming product, you have to explain what it is that you're writing to this new person. That, with a myriad of other factors, makes new help on a project extend, rather than reduce, the time needed to finish a project. Voila, "mythical man-month".

So spam out, it's a good book.

Hang on, ah yes. If you've tried #develop and compared it to Microsoft's Visual Studio.NET, you'll see a pretty good example of a program versus a programming systems product (what comes after a programming product for Brooks). #develop has some great features (and I honestly haven't looked at its code; it could be very good), but usability isn't anywhere as close to being as good as VS.NET.

I like the concept of an open source IDE for C# (and when I start C# programming in earnest, I'm going to give #develop another good shot), but let's face it, some scary dude holding up a shirt just can't compete with Microsoft's VS.NET team when it comes to testing all the in's and out's of an IDE. Some things in #develop might make perfect sense to the people most closely associated to the project, but it's not as well-done overall as the behemoth VS.NET coming outta Washington state.

Labels:


posted by ruffin at 9/26/2002 01:02:00 PM

<< Older | Newer >>


Support freedom
All posts can be accessed here:


Just the last year o' posts:

URLs I want to remember:
* Atari 2600 programming on your Mac
* joel on software (tip pt)
* Professional links: resume, github, paltry StackOverflow * Regular Expression Introduction (copy)
* The hex editor whose name I forget
* JSONLint to pretty-ify JSON
* Using CommonDialog in VB 6 * Free zip utils
* git repo mapped drive setup * Regex Tester
* Read the bits about the zone * Find column in sql server db by name
* Giant ASCII Textifier in Stick Figures (in Ivrit) * Quick intro to Javascript
* Don't [over-]sweat "micro-optimization" * Parsing str's in VB6
* .ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture); (src) * Break on a Lenovo T430: Fn+Alt+B
email if ya gotta, RSS if ya wanna RSS, (?_?), ยข, & ? if you're keypadless


Powered by Blogger etree.org Curmudgeon Gamer badge
The postings on this site are [usually] my own and do not necessarily reflect the views of any employer, past or present, or other entity.