The need for tooling and the need for mastering your tools
muratbuffalo.blogspot.com
muratbuffalo.blogspot.com
It wasn't easy but as soon as I got the hang of things I was able to improve a lot in terms of overall productivity. Knowing how to debug when things go wrong and where to look to solve it was the first step in my learning journey. I eventually started heavily customizing by making scripts and packages to further suit my needs.
> After you master a tool, you internalize it and go minimalist, and reduce it to first principles. This line made me feel like I'm on the right track. Just recently I've cleared up the fluff in my emacs config leaving only simple but effective and essential tools. I realized that I've made a lot of edits to my config and that each one taught me something that eventually led to where i am now. In a way, clearing things out was a learning experience in itself.
I still have a lot to learn though. Just recently I've made a jump to reading the enacs source and even took the time to contribute to Remacs, a Rust port of Emacs. I'll admit that this one is a bit overwhelming and may even seem overdoing it, but it is still a fun learning experience.
I sure do love my tool.
If I ever did, I think I'd start with text processing. If you are an expert at slicing, dicing, processing, and piping text? A bunch of other stuff suddenly becomes much easier.
What specifically do you think is wrong with the existing approaches? It's an area I also care a lot about and would like to gain more insight into. :-]
syntax on
set number
set relativenumberOf course, if all you're looking for is modal editing in emacs and don't mind falling back to emacs keybinds, then evil mode will do just fine for you.
The question is rather,
- do you want to start an emacs config from scratch (then you install and configure whatever plugins you want, including Evil)
- or go for one of the community managed ones? The most popular being spacemacs[1], but there's also doom-emacs[2], both are geared towards people that come from VIM and/or want to use VIM-like editing in emacs
[1] http://spacemacs.org/ [2] https://github.com/hlissner/doom-emacs
The two main reasons I ignored this advice initially is that I was mainly on windows and that vim has some great windowing abilities. I knew about cygwin as an answer to the first but I didn't know about tmux previously, perhaps I didn't need to know because vim already had a similar feature set.
Nowadays my vim setup is almost as minimal as yours.
I usually have more settings, but on a temp machine that's all I need.
set ruler set wildmenu set showcmd set scrolloff=4
why thank you!
One immediately obvious use is basic navigation. That line above I want to go to is 13, so '13k'. Now I'm there.
Maybe I'm not "there" yet. But for now, I feel that the more things I start doing in Emacs, the more productive I get (and the more fun I'm having). They say Emacs is an OS; I find it to be a damn great one. Its UI model is a better fit for 90% of things I do on a computer than the standard one.
Did you know that the content is also shallow? According to E.D. Hirsch [1], one of the reasons low-income and other marginalized groups do bad in schools after elementary school is because they lack the exposure to "cultural vocabulary" and end up feeling like a fish out of water when any more challenging material comes up.
So in line with the spirit of the OP, some of the "tooling" that we need in education is simply a deeper understanding of the national culture that all well-educated people have naturally adopted.
For instance, you could help low income students by simply having them watch shows like The Big Bang Theory and then maybe have a discussion about it in class. (And I say this as someone who doesn't like that show. But I know it speaks a very strong cultural language used by well-educated Americans.)
Although this is interesting: http://hackeducation.com/2015/04/25/factory-model
It‘s very satisfying, say in an algorithms class, to come up with an algorithm that satisfies the given runtime requirements, often taking ideas from multiple basis courses - and this is expected. It‘s always explicitly stated that the goal is not to, say, remember an algorithm like Dijkstra by heart, but to internalize how to come up with such an algorithm, as the exam is also structured around coming up with new algorithms.
As a tools author though I struggle to produce things that are both powerful yet also easy to use. I tend to build things that are too “UNIX-y” - and I end up with blank stares from co-workers (users) when I ask them, “did you read the —-help output?” Or likewise when I suggest that perhaps they can wrap tools in bash scripts or aliases and bolt things together...
Normally, one uses lex in conjunction with compilers, but it would work for this job---as each word was found, generate the output with a link to the glossary; otherwise just copy the input to the output. Half an hour later we were done with the entire task.
I just now realized that there may have been more to the approaches than I realized. I was looking at this very tedious task and not wanting to do it. Why not have the computer do the boring grunt work of finding and editing? But we were being paid hourly and it could have been that my friend was looking forward to doing this very tedious job for hours and making that much more money. I am reminded of the Upton Sinclair quote, "It is difficult to get a man to understand something, when his salary depends upon his not understanding it."
It could also have been that I think differently and realized the application of a standard Unix tool normally used for one task was appropriate for this task and my friend just couldn't see it. Either could be possible.
I have to wonder how much of this is due to "not understanding that the computer can be instructed to do the boring stuff" versus the "I don't want to code myself out of a job."
Aside: It's not only the explicit prospect of hours of work that might have stymied your friend... research suggests that when working for a reward people are typically less creative and less thoughtful than when intrinsically motivated (see Alfie Kohn's book Punished by Rewards).
And your point about hard work really makes since given her background and personality.
As someone who occasionally hires developers, hour rates of a grunt who knows how to edit HTML and someone with a CS degree who knows how compilers work and and can dive into lex/yacc during an interview differ significantly.
But that doesn't mean your tool is bad or too 'hard to use'.
I know that stuff shouldn't be complex for complexity's sake, but I also frequently notice an anti-intellectual attitude in our profession. I see people learning just about enough of programming to land a job, and then refusing to learn any further. This is a pretty weird behaviour, IMO, but sadly not uncommon.
While the raw functionality is often very complex and met with blank stares, I've realized I find new excitement in refining and building pretty "front-ends" in the spreadsheet that simplify things for end-users.
Finding interest in the challenges of simplifying and polishing for others is one path forward with your struggle. It was a definite shift as before my focus was on making them as powerful as possible. Only when I realized that the most powerful tool in the world is useless unless people adopt it was I able to break free of my old mental model.
The problem is really hard. I can build such tools, but it takes me 2-4 times longer than making an equally powerful tool with rudimentary UX barely enough for me only.
Also I’m from Windows world, here “easy to use” == “rich GUI”. Also shell scripts + text streams is rarely a good way to compose stuff here, people are used to APIs/libraries/COM interfaces.
However, it is also easy to find evidence that quality of tooling does not translate to quality products in software. Not the least piece of evidence is Linux and the rise of free as in beer tooling.
I think it can easily diverge into navel gazing. It isn't that tooling is unimportant. But that it should not become the focus. If you want to make quality products, obsess over the quality of your product. Don't get distracted by what you know about what went into it. Focus on the product. Period.
Yes, you will at times have to settle for a proxy measure. No, they will not be perfect. Nor can they be. Don't fixate on a single metric, but collect many and constantly ask yourself what the metric is telling you about the product. Not about itself.
The examples given (paxos and map-reduce) are very high level concepts, which open the door to products which would be impossible or qualitatively very different without them.
When you lack experience building anything, it seems natural to think that the tools used by practitioners enable them to do what they do. After gaining experience, lots of it, you find that the tools can help build a scaffolding, but what you are really building can often be obscured by the scaffolding. Which is why it is not uncommon to see some experts that can work with minimal tooling. They have built their ability to see the product and end goal, without the need of some tooling.
Which is not to say you can always get by without tooling. No amount of internalizing the instrument and idea of flying will help a pilot fly without a plane, after all.
In e.g. painting those tools might include knowledge of anatomy, lighting, human color vision, paint chemistry, composition, perspective, art history, specific stroke techniques, ..., plus time management, working with live models, managing client expectations, a collection of unused ideas to try, previsualization, judging and adjusting preliminary sketches, ..., none of which has anything to do with the specific canvas or brushes or subject. The expert will get better results from inferior paints and brushes and studio, because of all their other hidden tools. What seems from outside like 'minimal tooling' is actually a cornucopia of tools.
There are two aspects here. First, metaphorical tools are stretching the usefulness of the term tool to an extent. We already have a term for that, knowledge. It serves a different purpose than tooling. Specifically, tools act as great methods to let someone without the knowledge benefit from it.
So, the standard library of most languages helps give tools to developers such that they don't have to know the details of the data structures. Just as paints let a painter not have to know the details of the pigments or other components of their supplies.
Then there is the aspect that the knowledge doesn't necessarily translate to results. It is easy to see how many critics are far more knowledgeable of their fields than many of the practitioners. Yet, your average practitioner is probably accomplishing more than your average critic.
I want to stress again, though, that it is not that tooling is unimportant. It is just an easy nerd snipe and is an easy way to divert from your actual task at hand and get very little accomplished.
The 'critics' have an entirely different toolset from 'practitioners'. Even their factual knowledge is of a different type, grounded in a different context, and not easily comparable. Likewise it doesn't make much sense to compare their 'accomplishments': criticism is its own valuable discipline with different goals.
Only when I changed Università and retook Analisi II, taught by a different prof, who demonstrated everything using more powerful and meaningful tools did I get it all.
Same thing with electromagnetism; couldn’t ever not make a mistake with those pesky Maxwell equations until I bumped into some lecture notes treating them with Diadic Calculus (a kind of tensor) and voila, I passed.
My brain is pretty average, particularly when referring to working memory. Give me a strong abstraction and I get it, ask me to wade through the minutiae and I lose it.
You spend a few hours tinkering with settings, then two years pass like a breeze, you have reinstalled your system / on another employer's laptop, and you have to re-configure everything. From memory. That's frustrating.
Yes, I carry around a .zshrc from the times when I still made the effort.
Otherwise I would prefer convention over configuration. Just provide sane defaults. Please.
Moreover, when you're an infrequent programmer, you would want to invest the least into tuning tools. E.g. I won't waste time setting up configs on a zillion servers that I visit. I'll use bash. It's better today than it was 15 years ago.
Now I minimize my time wasted tweaking things that don't matter. I just use Fedora (stock with Gnome 3) with about 20 combined LOC for vimrc, emacs configs, and bashrcs. I embrace the defaults.
That's why we treat configuration as code these days. Put all configuration files that matter in a repo.
And if a tool does not take a plain-text config file, or at least allow you to export settings to a plain-text file for later re-import, it's frankly not worth your time.
Few hours spent on setting up your environment at a new job is still a great bargain if it makes you more productive (and/or makes you enjoy the work more).
I agree with the OP that internalizing a tool changes your brain for the better. Everyone knows that learning a new language (human language) expands your brain and improves your ability to learn more languages. Let's continue this example, just to make things clearer. Mastering foreign languages is not a cakewalk, despite scattered marketing claims that you can do it in a year or even three months. From the OP:
> Just having a passing familiarity with the tool doesn't empower you.
You can't learn Korean just by visiting Korea and waiting for osmosis to take effect. Even people who live in foreign countries for decades fail to learn the language if they don't put in the appropriate effort -- I've seen it happen. But "You are not your tools" makes the following dim-witted assertion:
> Spend your time listening and learning from everyone, whatever tools they use: most skills will transfer just fine.
That's exactly the opposite of what you should do. You will internalize nothing with this plan, nothing will "transfer" (if anything you will have interference[2]), and you will just end up like so many other mediocre programmers I see. Anyone who's learned a foreign language knows this -- you need skillful Practice and Concentration. Trying to learn two languages at once takes more than twice as much effort than if you focused on one, if you don't do it with great skill.
Quote from my blog post:
> There is a huge gap between the average programmer and the real hacker. On one side of the gap is the doe-eyed little boy who goes into every project clueless about how to start, searching for a relevant tutorial on Google while frantically asking questions on StackOverflow. On the other side is the man who plunges into the project with an air of mastery, controlling his environment with a fluid ease which is rare and somewhat dangerous – a man who’s already finishing the task by the time the boy has gotten his first response on StackOverflow. Which side of that gap do you want to be on all your life?
Now returning to the OP.
> What qualifies as a tool? Does critical reading qualify? How about writing well?
These absolutely qualify. These are fundamental tools -- mastering them will improve many other areas of your life. But you would not believe how few programmers take the time to improve these skills, or even care. Sometimes I get the feeling that the average programmer hasn't read a single book in his life (apart from maybe some programming or self-improvement books, which are generally poorly written and unimaginative). It shows.
> What are the tools that benefited you the most?
Emacs, without question. I took the time to learn it during a spell of happy unemployment as I was living abroad. This one decision has paid enormous dividends in my life, but only because I took the time to truly master this tool. It not only has made me more productive at pretty much everything I do on computers (which in itself is valuable -- the more prolific you are, the better you become), but it made me smarter and more confident on account of having mastered something. Men are supposed to be experts. Mastering something silences your inner critic and cues your brain in to your innate self-worth -- it's how male brains seem to function.
You can learn Vim instead, but please avoid IDEs. Easy-to-use, lowest-common-demoninator, "thoughtless" tools actually seem to be making people dumber. It's the path of least resistance versus the path of blood, sweat and tears -- and they go in opposite directions.
A question the OP should have asked, but didn't:
> How do you know when you've mastered a tool?
You will know. It changes the way you see the world. New possibilities arise, the horizon broadens, and you begin to see with lucidity how powerful you are and how far your potential truly goes.
As J. Peterson says,
> People create their worlds with the tools they have directly at hand. Faulty tools produce faulty results. Repeated use of the same faulty tools produces the same faulty results.
A quote from Kafka on the Shore:
> Pointless thinking is worse than no thinking at all.
[0]: https://codewithoutrules.com/2018/03/23/you-are-not-your-too.... These kinds of articles are not just idiotic, but harmful to society -- the attitude expressed here will make people worse at their jobs and at life, and we should speak out against this pernicious mindset.
[1]: I won't post my article here, as my blog can be found on my user page. I posted it on Reddit and received a hostile and, well, juvenile response. A lot of people took issue with the idea that certain tools are better than others (seems like Vim/Emacs are not liked there) and the idea of someone taking mastery seriously ("You must be fun at parties" was, I kid you not, an upvoted response). It's not just about mastering your tools, but mastering your environment by extension. It's about power -- the power to change our world -- for the better. Many people embody a mediocrity mindset and go through life without skill or strategy -- they unconsciously know their own inadequacy, and you can see this on their faces.
I would argue that you should learn both. It really depends on the context. Vim/emacs are nice, but for certain tasks, IDEs are more suitable. I would also recommend to master your OS shortcuts, we edit a lot of text outside vim/emacs.
In general I don't think the editor really makes much difference. The article emphasises tools at a slightly higher level - more algorithmic. I think this is more important.
VIM / emacs are great if you work in a unix environment, but as a windows user Id rather have nice GUI tools. Requires less memorization to do the same tasks.
I would also argue against memorizing shortcuts as well, and if you do, only a select few that you often use. Rather have a quick reference file on hand for these shortcuts to memorize.
Stop instigating shit.