For understanding: this proof makes sense if you (incorrectly) assume that any two horses are the same color, because then you can take any pair of horses in an n-sized group and split it into intersecting pairs to show that theyre all the same color. With this assumption, this inductive proof would work as well.
>My favorite part of the photographic process was watching prints come to life. I loved starting with a blank sheet of paper and applying various photographic methods to bring the image to life.
>I found that building websites was similarly satisfying. For example, click the "Reveal Image" button to watch an image fade in to the blank canvas!
I think a lot about why I went into computer science and this is the same conclusion I came to. There's something really cool about starting with a blank page and coding in elements that appear one by one and adapting the code to be what you want. Maybe there's other ways to do it but programming seemed to be the most powerful.
Just to be clear, it was video games, not photography that kinda nudged me into programming, but same idea with a blank canvas and having control of it.
This gets me too. In high school I called it "the power of a blank text file." Something about knowing that this was how every great software product began life was very empowering and intoxicating to me.
When you open vim and look at the blinking cursor, you stand on the precipice of greatness in the shoes of every programmer who has ever lived, all of you united across space and time by that peculiar feeling you get when you peer into the infinite possibilities of your empty text file.
I suppose this is what "high self-effiacy"[0] means.
I've only recently learned this word/concept, but your quote fits. You see a blank text file, you see an interesting challenge, something you're sure will lead you somewhere nice. I'm gonna admit - I'm the opposite. A blank text file scares me. I don't know what to do. I spend a lot of time agonizing over what I want to write, trying to desperately narrow the space of possibilities until I have the design[1] sharp in my head, and only then I'm able to actually write anything in that empty file.
I guess I'm the "low self-effiacy" kind of person.
This may come across as facetious and/or condescending, despite my intentions to be to give actual advice here... Learning TDD is what helped me get past this. It's surely not the only way to do it but it really made it click when I did.
In learning the craftsman style of TDD (i.e., the fluffy altruistic style) helped me to grok breaking down tasks, not because I wasn't able to have a detailed view of the big picture in my head, but because I simply didn't need to. It's also ok to change what you've already done. The guidelines for code modularity and separation are there to make this process of change and evolution easier, not just to make the system arch and code pretty, but because it should be expected to change and evolve your code as you develop the system - in both the short and long term.
It doesn't come across as facetious/condescending. Thank you for your advice.
I'm actually using a TDD-ish approach in my work, but I never felt comfortable letting it actually drive design decisions. I don't believe it works that way - I can explore the design space up front and pick good solutions faster than it would take me to organically arrive at them through applying orthodox TDD.
I'd like to do more TDD-ish approach, because the design process feels way too slow to me. The problem is, refactoring involved in test-driven design discovery is even slower. I constantly feel bottlenecked by the speed of tooling we use - and not on the surface level (I have my Emacs configured well, thank you), but at a fundamental one. Programming languages are not expressive enough. The whole approach of writing code as plaintext document is not ergonomic enough.
When I'm sitting in front of an empty text file, staring at the sea of infinite possibilities, all I feel is dread - the fear of how much effort I'm going to spend fighting tools to conceptualize my design, how much time I'm going to waste dealing with infrastructure, build systems, dependency management, constructing intermediary layers, writing and rewriting tests...
I start at step 1 in the task I'm trying to accomplish. First write the main function then put in the first thing your program needs to do.
I guess I usually have a plan before I even sit at the editor of what I'm going to accomplish with the project. You don't have to know all the classes and data structures you'll need at the start, you will discover it along the way when you find you have data you need to group together or code you need to call in multiple places.
I think of writing code like writing a list of instructions to tell the computer how to do something. The natural place to start is step 1. Then of course you can start roughing out the major steps in order and filling in the details once you have something you can run and start testing parts with (either manually or automatically).
This resonates well with me. I too have my Emacs well configured and I dread the blank canvas. I think it also might have to do with me being an avid procrastinator.
I am like you too. I’m not fond of blank projects where I can let creativity thrive. I would not know what to do. But give me a piece of paper and an idea and I can roughly detail all requirements for the project, create a backlog and tasks for a week. I’m more interested into the coding challenge offered by the work. I get more satisfaction in finding the best solution than in the result.
My introduction to computers was similar. I began by learning turtle graphics in the Logo programming language during my childhood days. It allowed me to be creative and draw pictures on a blank canvas using code. Back then, for me, programming was not about solving useful problems. Instead it was about expressing whatever random ideas come to mind.
Quoting a relevant excerpt from my own blog post[1] that I wrote sometime back:
> FD 100
> That is the "hello, world" of turtle graphics in Logo. That simple line of code changed my world. I could make stuff happen in an otherwise mostly blank monochrome CRT display. Until then I had seen CRTs in televisions where I had very little control on what I see on the screen. But now, I had control! The turtle became my toy and I could make it draw anything on a 320 × 250 canvas.
Me too. I learned LOGO in the 90's during 3rd grade. Now thinking back, it was probably an important defining moment in my life because it let me experience creativity through coding and visual feedback (and also the constant discovery of new ways of using the various commands).
Similar sort of experience, although we had no turtle, so it was BASIC on the MICRO for us.
10 MODE 7
20 PRINT CHR$141”A text adventure”
30 PRINT CHR$141”A text adventure”
May as well have been the opening bars of Beethoven’s 5th, for the infinite and incredible possibilities which followed. Anything. I could make anything. It was the most incredible sensation and realisation - and still is.
I think this kind of experience is missing for kids now – but I'd guess it's more about how ubiquitous computers are, and how there's a lot more between the kid and the computer. When a CLI is your interface, making even rudimentary graphics feels like achieving magic. When your interface is a cell phone or GUI, there's a much larger leap from zero to "feels like magic" – OK, so I made a circle bounce around the screen... there's already an app that does that.
Totally. I mean, as ridiculous as it may seem, the thing that got me into Linux was seeing a printout of a screenshot of Enlightenment 15 and just going “what is that” - and for me, the idea that a GUI could be visually exciting was revelatory - I ended up wrapping my head around SuSE 4.2 on hardware it hated, getting E16 running (hey, it took me a while to figure out X, never mind anything else), and ended up learning C, C++ and Ruby because I wanted to make more of this unbelievably cool (in a very 90’s way) stuff.
Now… Great UIs are everywhere. You can just use them. You don’t need to poke under the hood, or learn the mechanics of CRTs, or compile a kernel and a zillion libraries to get them working - you just flip open your phone, or hit up the uri.
I think there’s something quite specific about having learned the trade through that cusp, that changing of worlds - if you started with punch cards and ended with dumb terminals, your world changed only somewhat, and always had a utilitarian edge to it - we went through that Bildungsroman of growth and explosive expansion as a natural function of our environment.
I feel somewhat blessed to have been born in possibly the most interesting time since Gutenberg wrote “hallo, welt”.
Heh, Enlightenment (somewhere before DR13) was also what got me interested in Linux, as a kid. But, in retrospect, I'd classify it as a "pretty UI" rather than a "great UI."
I feel like for a lot of us, at its most basic level, software development is truly creative. It's not the activity that people traditionally associate with the term "creative outlet" but for me at least it's akin to combining human emotional experience and music theory to compose a song or a flavor inspiration and the 12 tastes in food to create a dish. Even further as I've moved into a Machine Learning Engineer role the creative aspect needn't even be sensual, like visual or auditory, it could be totally abstract: I find the concept of some of the tensorflow graphs I have created to be beautiful even though they are way too complex to visualize (suck it tensorboard).
Completely agree. I wonder what it is about programming something from nothing that still makes people think it isn't a creative pursuit. The Venn diagram of writers, painters, guitarists and programmers needs to be more heavily advertised to get past this stigma of engineer meaning some boring old fart typing mindless code at a keyboard.
Old timer who had an Apple II as a kid, and the experience I try to sneak into every class I teach is:
10 PRINT "John is Awesome";
20 GOTO 10
This little gem is the beginning of it all. Little me is understanding, okay, so if I'm willing to put in the time and thought, the machine will obey and I I have the literal power of infinity at my fingertips.
I once wrote my daughter a similar BASIC program…she immediately changed it to her sisters name and wrote “S is stupid” and said “see, the computer said so so it must be true.”
I tried to reach her programming but she schooled me in AI-hype.
That's kinda what did AND didn't work for me when it came to programming.
In college my first class was a class about C, the instructor read from the book (that appeared to be written about C for people who already knew C...) and then you worked on the assignment.
I didn't have the patience at that age to work that way and dropped the class / decided programming wasn't for me.
I did some other tech things and decades later ended up working with a bunch of engineers at a company and realized that we understood each other / how we worked really well. Company was bought out and I had time to think about what to do next.
By this time the world of web development and web apps had taken off and there was so much information available / folks sharing the land of programming seemed entirely different to me. Attended a boot camp and everything just clicked, the immediacy of producing something in a web app (even if it broke) really drove home what I was doing and so on. I've been happily coding since then.
Similar thing happened to me. I had to take a C++ course (with C++ 2008 on Windows) and hated the way it was taught. I conflated that with hating programming. After I finished my engineering degree, I got frustrated with repetitive tedious manual processes, so I started automating them. As my skill grew, I realized I liked programming more than I liked being a mechanical engineer. Now I write code full time, but I'd be way farther ahead if I'd just got the CS degree to start with.
But since then have you gone back and learned all of that stuff from those classes? Is the point of school to make you interested in the first place or just assume you already found the topic interesting and see the value and you want to learn more
Yes, sort of. I haven't taken a deep dive into anything like how to implement an OS, and I know I'm woefully undereducated about networking and the internet, but I have a tough time learning stuff without a concrete problem to solve that will make my life better. For example, I've written plenty of stuff that uses Python's requests library, but I don't know what happens under the hood between me making the library call and the network packets leaving the PC. I'd like to learn, but I don't have any problems facing me that would require that skillset or anything tangentially related.
As far as programming itself and designing software, I think I have learned as much as I would have retained in an undergraduate degree in CS. I have a minor in math and I took some basic circuits courses, and Ben Eater's YouTube channel has been hugely illuminating in areas of CS.
Really, if I could find places that are something like "solve this useful problem, here are the requirements, you'll need to know these 10 keywords to search stuff on the internet, here's how it'll be useful later" and then have someone or something evaluate my work, I'd love to see it.
Yep, same same, but different. For me it was music and sound, starting with a blank canvas and mixing in digital signals and controls to build something out. Could have been with a DAW, but programming was just a more flexible and free-form blank-canvas for self expression.
...although I also got a kick out of "remixing" Windows 95. And "remixing" video games (Civ and Colonization were particularly great because they were SO EASY to edit both assets and configuration). So many custom mouse cursors, shutdown screens, start-up sounds, etc etc.
Ha! Both of those are Microprose games! I remember mixing XCOM and Transport Tycoon music. It was really amusing when you failed an XCOM mission and the upbeat song Road Hog played, as if it's mocking your ineptitude (of course, the same music is played when you win a mission too. Oh well).
For me, programming was like being a little god in my own little world. For an introvert especially, it was exhilarating. You write a command, and it obeys. When you see something on screen is even more satisfying.
In fact, the all-night coding binges happen because in an intense period of learning, you are producing a ton of adrenaline, and that annihilates sleep. (Sorry, working, don't care to look for the study right now). But it checks out.
I know that feeling. It's a godlike feeling. We start with literally nothing and we create whole a universe inside the computer. A personal virtual universe that reflects our minds and our understanding. We are the gods of these realms.
This was my go-to answer for why I started programming, too. Only recently I realized that it didn't hold true for me, the real drive I think was wanting to explore things. I loved computers, and games, and naturally was very curious about wanting to understand why and how they worked.
Understanding driving motivations is so incredibly important, as it now gives me quite a lot more perspective in which direction I want to take my career and hobbies.
I found it to be like my favorite toy as a kid: Lego, with the computer i could do something very similar and build my own stuff, i never wanted to do anything else..
Yeah, there's a lot of crypto that's specifically tailored to minimizing the effect of mistakes like IV-reuse and it's not solved, the primitives can't do everything, so it's good to know these pitfalls. This book is more theoretical than that though and there's probably better sources idk.
For most use cases, you should also add a local bind, "-Llocalhost:5900:localhost:5900" or else everyone at the coffee shop will be able to access your insecure Vnc server
The manual page says, "By default, the local port is bound in accordance with the GatewayPorts setting."
I don't see GatewayPorts in any of the config files, so the binary (at least mine) is probably built to have this off by default. Which seems like a sensible setting.
EDIT: It can't hurt to be sure, though. Especially if you're running ssh commands on different computers or writing a script that runs ssh.