Brent
03/19/2020, 6:42 PMSrini K
03/19/2020, 7:50 PMDan Cook
03/19/2020, 7:59 PMSrini K
03/19/2020, 8:07 PMSrini K
03/19/2020, 8:07 PMDan Cook
03/19/2020, 8:13 PMDavid Piepgrass
03/20/2020, 12:24 AMDavid Piepgrass
03/20/2020, 12:28 AMDavid Piepgrass
03/20/2020, 1:04 AMDavid Piepgrass
03/20/2020, 1:18 AMIMessageSink
for both (sometimes I wonder if no one else has noticed this). Similarly I often see interfaces like ISomethingRetriever
whose job is to retrieve some kind of object given some kind of key. That's basically a dictionary! Just implement IReadOnlyDictionary
, you fool, or whatever your language's equivalent is. Do not create a new and different interface every time you need to retrieve a new kind of object. More broadly, design both your interfaces and your components to be generic, reusable, and ignorant.
5. Pick good names and write documentation that describes things in a different way than the names do. I often write documentation for a class before its code, which leads to clear thinking and good separation of concerns. (However I have to correct the documentation later because I usually tweak something or change plans midstream.) Documentation of large-scale entities (classes, modules) and mutable state (e.g. invariants) is often more important than documentation of small-scale entities (small functions and code blocks).
6. Write good tests (or prove correctness)
7. Think long and hard about your decisions. Agonize over them. You'll never come up with an optimal design by doing the first thing that comes to mind. Even after you implement it, be on the lookout for a better approach (either so you can use it in the future, or ideally, improve the original code).
8. Be on the lookout for new and better general-purpose techniques, and then actually use those techniques. I am slightly irritated whenever I see professional developers using strings when they should be using Symbols. Why? Do you use strings in C# because it doesn't have Symbols? But you've seen Symbols in Ruby and ES6 - take the lesson you learned in the other language and apply it to C#.
(When I wrote this I was thinking of the question "what events stand out as important learning points in your path to technical enlightenment?" but now I see that, rather than answer the question, I've simply explained what I think an enlightened programmer does. I don't remember how I learned this stuff, but I am quite convinced of its importance.)Brent
03/20/2020, 11:05 AMSo then the question is … are you interested in turning unmotivated students into computational thinkers? Or do you want to teach motivated students better Python?
It’s a very interesting angle to think about it from; thank you. I am interested in removing unnecessary blocker to knowledge acquisition; and hopefully - creating environments which are strong enablers of knowledge sharing. Dataquest.io does seem to be built on some very similar ideas. Are you aware of any platforms that take a similar approach for non-data science fields in technology? My personal interest with this space is I want to be able to understand technical things faster. I feel quite a few things in programming are relatively straight forward; however - getting the key insights and understanding which are at the core of an approach / idea can be, for me, a somewhat difficult process. I’m just trying to take that angle and see if it can be turned into something that other people also find useful.
"Programming" is usually taught in terms of learning a specific language or tool
I am far too ashamed to go into any level of detail of how badly messed up my “foundational” concepts of programming were; based on the introductory C++ courses I did at Uni. This extended many years into my professional career. And - how do I know when I “fixed” it? So terrifying.
write documentation that describes things in a different way than the names do
Oh man; this is a hill I will die on! Billions of years of evolution culminates in
// Finds project by Id
getProjectByIdBrent
03/20/2020, 11:06 AMEverything should be made as simple as possible, but no simpler.
Whilst things often get buried in accidental complexity; it is also easy to forget actual complexity. I think https://github.com/promises-aplus/promises-spec/issues/94 is a really interesting real world scenario. If the community could have that discussion again; could we have better ways of framing “known” information so that people with different backgrounds could get up to speed efficiently - towards the goal of having more progressive debates and reaching what in retrospect are agreed to be “correct” decisions.Brent
03/20/2020, 11:08 AMSrini K
03/20/2020, 2:22 PMOne angle I’ve homed in on is the principle that “easy-sounding things should be easy”. Programming is full of things that seem like they should be easy, but are unnecessarily hard in practice.@david 100% agree. A few points: • In video game design, people often talk about “easy to start, hard to master”. I kinda like that approach and that’s essentially what MS Excel does. You can simulate complex stuff in Excel, but if you just want to add a bunch of numbers, create a plot, its REALLY easy to do so. Python on the other hand has like an hour of setup and a bunch of different tools and libraries to learn just to do that simple set of tasks that you can do more quickly on a piece of paper! • Another thing I’ll say, that Bret / Dynamicland people talk about a lot that I agree with … is that the fundamental REAL logic in most programs is very simple and short to express. However, bringing that to life adds the remaining 95% of code. Compatability with standards, browsers, optimizing performance, GUI, low level hardware stuff, etc. All of that is powered by brittle, complex, opaque software. I like what Bret said in an interview last year … “the real world simulates itself”, so the code for your unique logic / idea is very simple and minimal and can be understood and iterated on quickly. A lot of it can fit in your short-term memory (Alan Kay talks about getting things down to “a few pages of code”, which was the threshold under which even 6 year olds can program).
Anyway, it seems like really good teaching is hard. I was really impressed with how vuemastery.com teaches VueAfter 5 years in this trying to teach aliens (what I call people you can’t see 😛) technical things, I’ve come to appreciate that “learning styles”, “teaching well”, “motivating students”, and all other phrases like this are MOSTLY BS (not completely, but mostly). This is a very strong statement, but in my opinion … it fundamentally comes down to teacher-learner fit (or content-learner fit). If you’re highly motivated and have a clear goal, and the learning content or teacher is teaching towards those goals, then everything is great! The student will say things like “I like how this teacher teaches” or “this meets my learning style” … but harmony in learning + teaching goals I think explains MOST of the stories people say. This is maybe a hot take, but just my perspective 😛 There’s still room for innovation though on the edges (people who are semi motivated but need to have a few aha moments delivered via fun videos or interactive simulations before they make a bigger learning commitment, etc).
Srini K
03/20/2020, 2:24 PMDataquest.io does seem to be built on some very similar ideas. Are you aware of any platforms that take a similar approach for non-data science fields in technology?@Brent oh yeah there’s a few. • Codecademy.com: Python, JS, other stuff (including data science) • Katacoda.com: for devops-y stuff, purchased by O’Reilley. • Codeschool was bought by Pluralsight but mostly hasn’t gone anywhere (PS has struggled to switch away from video based learning) • Datacamp.com: data science (Just throwing it in here) • There’s a few smaller niche sites that teach specific things, like https://www.sqlhabit.com/ and sqlbolt.com … both for SQL
Srini K
03/20/2020, 2:31 PMSrini K
03/20/2020, 2:33 PMSrini K
03/20/2020, 2:33 PMJared Windover
03/20/2020, 2:58 PM