Shared posts

31 Jan 01:13

You’re already a pretty good designer

by duopixel

I’m a seasoned hacker that is able to tackle immensely complex problems with aplomb. I’m able to untangle spaghetti code and weave it into beautiful patterns. I envision systems and code them with the same grace a jazz pianist improvises music.

But I can’t design for my life. Please help.

I’ve heard this story a couple of times in the ten years I’ve been working with programmers. Programming is a damn hard craft to learn. My mind is blown by the level of complexity software has achieved given the basic elements of programming—variables, conditions, loops, functions and objects. At times, it feels like you have a quarry, wood, rope, a saw, and a chisel and then an architect asks you to build a cathedral.

The programmers’ approach to building a cathedral would involve using his tools and raw materials in order to build more advanced objects. Let’s imagine the work of this craftsman: he’d grab some wood and stone in order to create a hammer, then he’d devise some pulleys to get rocks out of the quarry, he would build platforms and scaffolds to reach unaccessible places, he’d fabricate a crane to stack the stone, and so forth.

Our craftsman follows the architect’s plans religiously, and painstakingly chisels every stone so that every brick fits in perfectly. He polishes the wood into a huge sculpted door that would accommodate God himself. The massive columns wouldn’t fall in a thousand years.

Once finished, he steps back and mesmerized by the beauty of it all, he thinks ‘Hey, I built this cathedral all by myself, perhaps if I tried designing my own cathedral I’d get all the praise, instead of this lazy hack who just handed me the layout and waited for it to be built’.

Of course, when a programmer first tries his own hand at designing, he will likely notice that it looks pretty clumsy, there are a couple of reasons for this, but—all in all—the odds are stacked in his favor. It is absolutely necessary to identify the shortcomings of the programmers’ mindset in order to overcome these obstacles. Later on I’ll detail what works out in his favor.

1. Being familiar with the implementation difficulty encourages compromises

I’m a designer by trade, I have a degree in Information Design. But—as often happens— ignorance instills confidence, and I jumped into programming expecting it to be a challenging hobby, but it actually sucks you in and you come out a different person. I’m not a competent programmer by any measure, but it is an activity I enjoy throughly. I’ve built memela.com entirely on my own, you can also see my portfolio. Here is my StackOverflow profile. The paradox of learning is that the field is just so huge that you must admit you’re not able to master it in your entire lifetime.

When I first started programming, I’d start sketching a general idea on paper, and when I’d grow bored of it, I’d jump into Textmate and bang some code. Sometimes I’d encounter that a particular feature was difficult to implement, so I’d go back to my sketch and rework it so it was easier to implement, even if the user experience suffered in the process.

This, I think, is the biggest mistake programmers make when designing their own products. This is a form of technical debt that is incredibly expensive if done repeatedly, but it’s very tempting when you’ve been struggling with a particular problem for some time.

Nowadays I separate the designing and programming phases completely. I start by sketching on paper, then create a pixel perfect mock-up and then I finally start programming. If there is something that I find hard to implement, I ask for help, making me a better programmer in the process.

The equivalent of our medieval craftsman would be noticing that the doors of the cathedral are a lot of work, so he replaces it with a standard sized door. Soon enough the cathedral is inaugurated and there’s an unsurmountable bottleneck when the crowd tries to enter the cathedral.

2. Data modeling clouds your understanding of use cases and tasks

Nailing the data models is the hallmark of a competent software architect. It sets the foundation for clean, understandable code. Unfortunately, it also provides a data centric view of the entire project; and when the software architect designs the graphical interface, it looks a hell lot like the models with a CRUD interface slapped on.

Programmers get a lot of unjustified heat for designing these kind of interfaces. Very few people understand why data modeling shapes a very strong mental model of how the interface should work. This problem is often painfully obvious in backend administration systems, where the programmer is left on his own because designers are busy on the public side of the application. Often programmers rely on automated admin tools because—despite being a crucial component—clients don’t want to pay for it.

The key to escaping mental model contamination is thinking in terms of use cases and tasks. Whereas duplication and redundancy are the bane of good data models, it often is the opposite for use cases. In some supermarkets you will find mayo next to the tuna, a cereal island next to the milk refrigerators, and Clamato next to vodka (as well as in the usual places). Let me use information where I need it, not where the data model dictates it should be.

3. Most design is written about and taught from the perspective of art

When I was younger I would ask people how to dance, they would often suggest to “feel the music”. Once you feel the music you can start moving your body along with the rhythm, or so they said. “Just tell me how to move my feet and my arms”, this would invariably turn out wrong, because I’d just flail my arms at my own pace. A sad spectacle that I’d prefer to forget.

It wasn’t until the Rockstar type of games started coming out that I finally understood what they meant by feeling the rhythm. There is a bass that marks the predominant rhythm and some other instrument that marks a secondary rhythm. You pace a range of pre-defined movements to these instruments and boom, you’re dancing half decently. But alas, this revelation came too late and I’m still a terrible dancer.

Perhaps you have already asked a designer where to get started with design. I’m pretty sure his advice was to observe things carefully, notice the details, copy things you like to understand how they work. This is good advice, but it’s the same thing you would tell someone learning how to draw.

This is what I call art oriented advice and it’s the same kind of advice I was being dispensed when I asked how to dance. It’s useless to logical minds because when you like something you just don’t know what you’re supposed to be looking at. It comes naturally to people who have some art experience because they are used to observing proportion and balance.

People often make of design some sort commercial spawn of art. It is not. Design is a discipline in itself, related to engineering, that uses some of art’s syntax (in the case of visual design). It is different from engineering in the sense that engineering looks after the efficiency and robustness the product, and design looks at the interaction between the product and a human being.

Now, let’s get to the good stuff:

You are already a pretty good designer

If you have been programming for a number of years, you probably have very good design and architectural coding skills. These skills are connected to visual design at a high level of abstraction. The connections are so strong you can face off two masters of their own field and it will make sense to senior designers and programmers alike. In fact, I’m going to face Edsger Dijkstra against Charles Eames .

Design depends largely on constraints.

The ability of discerning high quality unavoidably implies the ability of identifying shortcomings.

Innovate as a last resort.

The competent programmer […] avoids clever tricks like the plague.

Who ever said that pleasure wasn’t functional?

There should be no such thing as boring mathematics.

Everything you already know about design and architecture in programming can be applied readily to visual design, with few exceptions. The problem is that your skill set is domain specific. You don’t have the bridge to apply what you know about software design into visual design.

You are already creative

Perhaps you have bought into the bullshit that creativity is a state of mind, an eureka moment that bursts into flash of brilliance to produce something that has never been done before.

I’d go as far as saying that the popular conception of creativity is actually harmful to good design, as it relies on established conventions in order to function. There is a time and moment to innovate, but it should never be done for innovation’s sake.

Creativity is being able to create things. Objects that can be shown, discussed and built upon. In this sense programmers are much more creative than many so called creative professionals out there.

Your systematic mind can be used to your own advantage

One of the most difficult concepts to teach young aspiring designers is the ability to think in systems. If I requested a button in 99designs (without more context), people would jump at the chance of creating shiny realistic buttons. You probably know what is wrong with this scenario: you can’t design a button without knowing how the rest of the design looks.

This is something that takes many years to mature in a designer, because the relationship between visual elements is not as obvious as it is in code. I’m not only talking about consistency, but the profound understanding that each element competes for attention, and that by making an unimportant element “shine” you are detracting from the rest of the elements.

You already have attention to detail

In a scale from 1 to 10, how sinful is choosing a poor name for a variable?
Now, in the same scale, what number would you chose for code where every variable had an awkward name?

This is attention to detail. Knowing that the details make the product itself. I’m constantly amazed by the discipline of some programmers, their code is carefully formatted, comments are succinct, and the structure is evident by just looking at it.

So, how do you get started learning design?

Design education is quite different from other disciplines. It needs to be so, because design is concerned as much with skill acquisition as it is with knowledge acquisition. It is project oriented, because that is how design is professionally articulated. Design is not subjective, as people often say, it’s meant to solve a problem, and the problem may have different solutions, some better than the others.

The actual structure of design education is centered around the design critique: the teacher explains some concepts, then asks his students to articulate something visual around those concepts adding some constraints, and then the final work is discussed as a group.

The actual critique mechanics are quite interesting. Every student lays their work on a large table, and the teacher will chose one, and ask other students what they think about it. At this point, authorship isn’t important. It’s likely the teacher and his peers don’t know who made it. The objective is not criticizing the student, it’s criticizing the piece of work. So a student volunteers an opinion, and the teacher validates it. After a small round of opinions, the teacher gives some insight and moves on to the next piece.

I’ve been thinking long and hard on how to replicate this experience online in a way that scales. I’ll extend it to other disciplines, but the initial course will be on design for programmers. If you are interested sign up to be notified when we launch, or just follow our Twitter. We will be writing more on this blog about the relationship between design and programming. Keep tuned.

26 Nov 19:50

An old friend

I met an old friend earlier this week.

This acquaintance goes under many names, and many faces. This time the manifestation was: “Yes, but just because you can’t find hard data that backs up the claim, doesn’t mean the claim is _false_.” The claim in question was the venerable “law” according to which “the cost to fix defects rises exponentially the later you find them”.

I’ve lost count of how many people said the above, often adding: “And anyway it is intuitively obvious that fixing defects later is more expensive, so the lack of hard evidence is not so damaging.” That this is a fatal error of reasoning is perhaps the key thesis in Leprechauns.

The question to ask yourself is: if that claim hadn’t been floating around in the industry for decades, underpinning most of the discourse on “requirements”, would it still strike you as intuitively obvious? Do you really think this is something that arises from first principles as a logical consequence of the nature of software development? Or are you privileging the hypothesis?

Let’s start from the very word “defect”, or informally “bug”. What counts as a bug? Does a typo count? How about a button misplaced so that it’s hard to click on it? There are many issues of that sort, that perhaps it’s tempting to think of as “trivial”, where quite obviously the cost-to-fix is small and is going to remain small no matter when you fix them.

Already this reasoning is enough to suggest that if there is a general functional form for “the cost to fix a defect”, it’s not an ironclad law that can apply to every single defect. At best it’s going to be a probabilistic law, something that applies “on average”.

Some “defects” are going to cost more as time passes because they are fundamental conceptual misunderstandings, upon which more and more of the final product comes to rely on as the software grows. For instance you can imagine a Content Management System where the assumption that an article can only ever have one author gradually becomes more and more pervasive, until “fixing” this “defect” would in effect entail rewriting the whole system. The question might be, then, whether these defects are common enough to outweigh the cheap-to-fix ones. We can already see that this is a non-obvious question (therefore hard evidence matters) and it may not have the same answer everywhere.

Another reason why fixing defects late can cost more is that the process makes it more expensive to fix defects later, as one HN commenter observed: “if a defect is found later in the our process, at least 2 qa analysts are involved…”.

Why does the process make it more costly to fix defects later? Because the process is built on the assumption that it makes sense to invest heavily in business analysts at the early stages (to get the requirements right), not so much into development (they’re an expensive commodity) and heavily in testing (we all know these developers still write lots of bugs, they can’t be trusted); so in that process “a project manager schedules out time and assigns the defect out to a developer, possibly not the one that introduced the defect gets the assignment to fix it”.

The causation is circular: of course if you measured the time to fix bugs under that process you would find the cost rising according to the phase when bugs are detected, because the process is built on this very assumption.

Software engineering is a social process, not a naturally occurring one - it therefore has the property that what we believe about software engineering has causal impacts on what is real about software engineering. Self-fulfilling prophecies are to be expected.

That should be reason enough for all of us not to trust our “intuitive” assessments of what makes sense, what is so “obvious” that we can dispense with experimental data and hard thinking.

26 Nov 19:49

"My kids often come home from school spouting crazy “facts” they’ve learned from classmates. It seems..."

“My kids often come home from school spouting crazy “facts” they’ve learned from classmates. It seems fundamentally human to repeat stories and, in the repeating, alter them—often unintentionally. Researchers do the same thing, and just this morning I was irritated to read an entirely inaccurate citation of one of my own papers. No doubt others have had similar feelings while reading my work.”
26 Oct 05:09

what git is not

There are obviously many reasons why Git is awesome (and why it sucks too), and there comes a point where it helps to dispel some of the rumors and issues surrounding Git. The following list attempts to show what Git is not. If you have your own reasons, feel free to contribute them to the comments and they may be added in.

1. Git is not Subversion with some added sugar sprinkled in.

Git works a lot differently than SVN and CVS. Probably the biggest difference is that Git stores content primarily, and it works mostly by taking snapshots of the information available. (This is why Git is commonly referred to as a ‘dumb information tracker’). Its algorithm for storing changes is fundamentally different from Subversion, and it much more efficient at doing so.

Also, if you’re used to having all of your projects in one huge repository, Git doesn’t really work like that either. Repositories are meant mostly for single projects, and then you could use submodules that link to other repos if needed. A tip covering how to deal with this situation will definitely be coming in the future.

The differences between Git and SVN could be in their own series of tips, but the Git-SVN Crash Course does a great job for those considering making the switch with drawing parallels.

2. Git is not expensive network or space wise.

Local commits are a huge advantage to using Git, and it means that your workflow can be made a lot smoother since it’s not talking over the network to a central server for most actions. If you want to know more about how this works, check out this post on the staging area or this one on pushing and pulling.

Another awesome advantage is that there’s one place where git stores its files for your repository (usually the .git directory) and it doesn’t litter your working copy with thousands of hidden directories and files like SVN does.

3. Git is not just for Linux kernel hackers or those who fly on airplanes all day to conferences.

Git can be installed on virtually every modern operating system, and it definitely works on Windows. GUI support isn’t there 100% on Windows, but plenty of work is being done on integrating into Explorer and to the various IDEs available. There’s plenty of slick tools available on other operating systems such as GitX on OSX.

4. Git is not hard to set up.

Setting up a Git repository is as simple as doing git init in any directory. It can’t get much simpler for that. Sharing your changes with others is when things get a bit more interesting. Usually sharing your changes is one or two commands away. Hosting your changes somewhere the right way can be a little tricky though: usually for self setup the best way to go is using gitosis, which is an tool that helps with getting SSH keys for users set up for commit access.

Update 26-Oct-2011: Note that the last commit of gitosis is from 2009. Gitolite nowadays seems to be better supported.

5. Git is not hard to learn.

Git’s manpages are quite extensive (and verbose), but there are plenty of other guides available for learning online. Some of the best are listed in the resources section in this site’s footer! For those new to Git, I usually recommend the Git Community Book and running through some of the GitCasts videos. (Reading this site counts too!)

6. Git is not complex.

Yes, there’s a lot of alien terminology and some concepts that aren’t instantly familiar to every newcomer, but the underlying concepts that the system is based on are fundamentally and purposefully simple. One great example is the blob-tree-commit structure. Once the basic concepts behind Git are grasped, it’s really easy to make the tool work the way you want it instead of letting it force you into a specific workflow. Sure, too much flexibility could be a bad thing, but when it offers so much power and ease of use, why not?

26 Oct 05:08

keep either file in merge conflicts

Sometimes when trying to resolve a merge, you may want to keep one file instead of the other. You don’t need to open up the files and fix the potentially hundreds of conflicts, you just want to choose the one you want and be done with it. Sadly, this isn’t exactly clear in older versions of Git, but more recent ones have made it easier. Big thanks to Kevin Old for his post on the subject which reminded me about this issue.

So, the scenario is: you’re in the middle of a merge, and you want to keep one file or the other.

$ git merge master     
  Auto-merged _layouts/default.html
  CONFLICT (content): Merge conflict in _layouts/default.html
  Auto-merged index.html
  CONFLICT (content): Merge conflict in index.html
  Automatic merge failed; fix conflicts and then commit the result.

There’s two unmerged files here. According to the git checkout manpage, there’s a --theirs and --ours options on the command. The former will keep the version of the file that you merged in, and the other will keep the original one we had.

The following commands will keep the original file for index.html, and then use the merged in file only for _layouts/default.html.

git checkout --ours index.html
git checkout --theirs _layouts/default.html

Sadly, these options are only in Git versions 1.6.1 and up. If you have an older version and don’t feel like upgrading, there’s ways to get around this. To emulate --theirs, we’d do:

git reset -- _layouts/default.html
git checkout MERGE_HEAD -- _layouts/default.html

And for --ours:

git reset -- index.html
git checkout ORIG_HEAD -- index.html

Of course, once you’ve got the conflicts worked out, git add whatever changes need to be added in, and git commit away. If you’ve run into other problems with merging that could possibly help out others, comment away!

24 Oct 19:41

smartly save stashes

I seem to be using stashing more and more, and I’ve found that seeing the stash list output looking like this isn’t very helpful:

$ git stash list
stash@{0}: WIP on feature1: b50788b... First pass...
stash@{1}: WIP on master: b50788b... First pass...
stash@{2}: WIP on shoulda: e783fb0... Upgrading the rest...

Sure, it’s got the commit SHA and message that your work was based off of, but if you’re anything like me, you forgot what you worked on the moment you stashed the changes and opened up that dreaded bug ticket that took hours to finish.

Instead, stashing like this is a lot better when you’re trying to figure out what you actually threw in there:

git stash save "your message here"

Now, your stashes will look a lot cleaner and hopefully help you save some time when pulling information out of there.

$ git stash list
stash@{0}: On shoulda: Updating instructions
stash@{1}: On master: started merge but need to fix #104 first
stash@{2}: On feature1: Adding some stuff

If you need to see what’s been changed for a certain stash, you can simply pass in the treeish for the stash, given in the git stash list output. The stash@{<number>} part shows you how to reference that changeset. Simply pass it into git diff to figure out what was changed:

$ git diff stash@{0}
diff --git a/TODO b/TODO
index b0ecaeb..4ca398c 100644
--- a/TODO
+++ b/TODO
@@ -1,4 +1,3 @@
 [ ] Easier configuration of Maruka and blahtex directories [mdreid]
 [ ] Accurate "related posts" calculator
-[ ] Autobuild
-[ ] Add more awesome.
+[ ] Autobuild
\ No newline at end of file

You could also use git show to see the commit it was based off of as well. If you’ve got more stash related tips or others that you can think of, let us know!

20 Sep 03:03

Sublime Text 2 for Ruby

Matz has said he wants Ruby to be the “80% language”, the ideal tool for 80% of software development. After switching from TextMate to Sublime Text 2 (ST2) a few months ago, I believe it’s the “80% editor”. You should switch to it, especially if you’re using TextMate.

Sublime Text 2 with Soda Light theme editing Ruby

Why Sublime Text 2?

  • Speed. It’s got the responsiveness of Vim/Emacs but in a full GUI environment. It doesn’t freeze/beachball. No need to install a special plugin just to have a workable “Find In Project” solution.

  • Polish. Some examples: Quit with one keystroke and windows and unsaved buffers are retained when you restart. Searching for files by name includes fuzzy matching and directory names. Whitespace is trimmed and newlines are added at the end of files. Configuration changes are applied instantly.

  • Split screen. I never felt like I missed this that much with TextMate, but I really appreciate it now. It’s ideal for having a class and unit test side-by-side on a 27-inch monitor.

  • Extensibility. The Python API is great for easily building your own extensions. There’s lots of example code in the wild to learn from. (More about this later.) ST2 support TextMate snippets and themes out-of-the-box.

  • Great for pair programming. TextMate people feel right at home. Vim users can use Vintage mode. When pairing with Vim users, they use command mode when they are driving. I just switch out of command mode and everything “just works”. (It also works on Linux, if that’s your thing.)

  • Updates. This is mainly just a knock on TextMate, but it’s comforting to see new dev builds pushed every couple weeks. The author also seems to be quite responsive in the user community. A build already shipped with support for retina displays, which I believe is scheduled for a TextMate release in 2014.

Getting Started

I’ve helped a handful of new ST2 users get setup over the past few months. Here are the steps I usually follow to take a new install from good to awesome:

  1. Install the subl command line tool. Assuming ~/bin is in your path:

       ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" ~/bin/subl
    

    It works like mate, but has more options. Check subl --help.

  2. Install Package Control. Package Control makes it easy to install/remove/upgrade ST2 packages.

    Open the ST2 console with Ctrl+` (like Quake). Then paste this Python code from this page and hit enter. Reboot ST2. (You only need to do this once. From now on you’ll use Package Control to manage ST2 packages.)

  3. Install the Soda theme. This dramatically improves the look and feel of the editor. Use Package Control to install the theme:

    • Press ⌘⇧P to open the Command Palette.
    • Select “Package Control: Install Package” and hit Enter.
    • Type “Theme - Soda” and hit Enter to install the Soda package.
  4. Start with a basic Settings file. You can use mine, which will activate the Soda Light theme. Reboot Sublime Text 2 so the Soda theme applies correctly. You can browse the default settings that ship with ST2 by choosing “Sublime Text 2” > “Preferences…” > “Settings - Default” to learn what you can configure.

  5. Install more packages. My essentials are SCSS, RSpec, DetectSyntax and Git. DetectSyntax solves the problem of ensuring your RSpec, Rails and regular Ruby files open in the right mode.

  6. Install CTags. CTags let you quickly navigate to code definitons (classes, methods, etc.). First:

       $ brew install ctags
    

    Then use Package Control to install the ST2 package. Check out the default CTags key bindings to see what you can do.

Leveling Up with Custom Commands

Sublime Text 2 makes it dead simple to write your own commands and key bindings in Python. Here are some custom bindings that I use:

  • Copy the path of the current file to the clipboard. Source
  • Close all tabs except the current one (reduces “tab sprawl”). Source
  • Switch between test files and class definitions (much faster than TextMate). Source
  • Compile CoffeeScript to JavaScript and display in a new buffer. Source

New key bindings are installed by dropping Python class files in ~/Library/Application Support/Sublime Text 2/Packages/User and then binding them from Default (OSX).sublime-keymap in the same directory. The ST2 Unofficial Documentation has more details.

Neil Sarkar, my colleague, wrote most of the code for all of the above within a few weeks of switching to ST2.

Running RSpec from Sublime Text 2

Using Sublime Text 2 with Ruby

This is my favorite part of my Sublime Text 2 config. I’ll admit: Out of the box (even with the RSpec package installed), ST2 sucks for running tests. Fortunately, Neil wrote a Python script that makes running RSpec from Sublime Text 2 much better than running it from TextMate via the RSpec bundle.

With this script installed, you can bind ⌘R to run the current file and ⌘⇧R to run the current test. The tests will run in Terminal. This is great for a number of reasons:

  • You can use any RSpec formatter and get nice, colored output.
  • Adding calls to debugger or binding.pry works. No need to change how you run your tests when you want to debug.
  • Window management. It’s smart enough to reuse the Terminal window for new test runs if you don’t close it. I put my Terminal window on the right 40% of my monitor.

This has really improved my TDD workflow when working on individual classes.

More Resources

  • Be sure to check out Brandon Keeper’s post on getting started with ST2.
  • This article on NetTuts has some good tips. (Although it’s a little out of date.)
  • My entire ST2 user directory is on GitHub, as is Neil’s.
  • You can search for ST2 packages here. Don’t be afraid to dive into their source – it’s usually quite approachable.

If you’ve tried Sublime Text 2, what did you think? What packages, key bindings, etc. are your favorites? What do you miss most from other editors?

20 Sep 03:03

Code Climate is free for Open Source

Today I’m excited to announce that Code Climate is free for open source projects. Many open source projects were added during the closed beta, and you can see them all on the new Explore page. (To learn more about what Code Climate provides and how it works, check out the homepage.)

This has been in the plans since the beginning and was one of the common requests since the launch for private accounts. It feels great to finally have it out the door. My hope is that Code Climate becomes as valuable a tool to Ruby open source development as Travis CI.

Code quality is especially important for OSS because of the large number of contributors they attract. Now quality metrics can complement a suite of automated tests to help ensure you’re shipping rock solid releases. Look out for more features around this coming soon.

Popular projects on Code Climate

You might be interested in taking a look at:

How to add repositories

To add any Ruby app or library that is hosted in a public GitHub repository, visit the Add GitHub Repository page. Just provide the name of the repo (e.g. thoughtbot/paperclip) and your email address. Code Climate will clone the project, analyze it, and shoot you an email when the metrics are ready. This only takes a few minutes.

08 Jul 02:16

Design for the Hardcore

One of the many things I heard this year at GDC that stuck with me goes something like “design your game for hardcore players first, then make it accessible for casual players.”  I’m probably butchering it a little bit - I heard it from my friend Mark Johns, who attributes it to Blizzard.  Who knows?  Maybe the original saying was “Anchovies are the best pizza topping.”

In any case, I like it.  The implication, to me, is that if you start with a shallow game you’ll end up with a shallow game, no matter how many doodads you stick onto it.  Instead, start with something deep, complex, and satisfying, and then polish it up.  Makes sense.

It also answers simply the question that is on every game designer’s mind: “who should I be designing for?”  Other than “myself”, the answer is not “hardcore” or “casual” (or the nebulous “core”), but “hardcore first, then casual”.

Defining hardcore: to me, these are the players who will enjoy your game at its deepest level, who will discover things about your game that you never knew existed, and who will champion your game and give it life for years to come.  They’re also the players who might turn off casual players by calling them “scrubs”, or telling them that they just aren’t good enough… or that they “don’t get it”.  But I think the benefits of having a hardcore fanbase far outweigh the consequences, and for every asshole who wants to shut new players out you’ll have a knight who wants to spread their infectious enthusiasm for your game far and wide.  (See: the Street Fighter and Dwarf Fortress communities)

As a game creator, I like the idea of converting casual players to the cause, rather than conceding things to them, or “dumbing down” my game for them.  I’ll enjoy the game more, they’ll enjoy the game more… everyone will enjoy the game more.  In game design as in anything else, I believe that win-win situations do exist and we should be seeking them out.  This idea - "design your game for hardcore players first, then make it accessible for casual players" - seems to me like the best way to approach a win-win situation.