I remember it was a primetime video in which you asked the chat something along the lines of "how many of you could code if you turn off LSP?" I took the challenge, put my neovim on hold and created a simple .vimrc file with a single plugin(vim-surround) and started using vim as my primary editor for rust. At the time I was reading the book "Learning Rust With Entirely Too Many Linked Lists", I decided to follow the book in my new vim setup. Based on the experience, I would like to add a few points to your LSP discussion: 1) I see an improvement in my ability to track how types change. LIke when I chain some functional programming constructs over some collection, I can feel what will be the type of the thing inside the closure. Also relying on mentally tracking types forces you to make some sane decisions which makes remembering the types easier. I will know that which variable is a reference an which is owned based on how I am going to use it. 2) It forces me to use the std library docs too often.Coz I use duckduckgo, it has a shortcut where I can search the rust std library docs directly thorugh my url bar, this feature is called 'bangs', It has made me much comfortable with reading the docs. Now I am not afraid of going down that rabbit hole. 3) Because there are no type hints and warnings when I do mistakes, I have to always run `cargo check` and see the compiler error messages. I am now a lot more comfortable when reading compiler error messages. 4) It might be helping me to plan better. So this ones a little tricky. Earlier if I had a variable then I would press tab on it in insert mode to see what methods I have on it and if any of them could be used to achieve something that might bring me closer to achieve the thing that I originally want. Now I have to think and plan about this before I start typing. 5) I like the minimalism of it. When I installed neovim on my arch linux, my adhd kicked in and I spent days configuring it down to the last detail. Now I am rocking a 20 line .vimrc file with a single plugin to write rust, C and python. Disclaimer: I am not working on projects the size of linux kernel with my current setup. My workflow is limited to advent of code problems, college homeworks, ctf's etc. Not very big projects involving a complex directory structure with hundreds of files. Although I have not done it long enough, but I hope that if I kept doing it then eventually, for my own sanity, I may start writing better code. If my editer is not reading code for me then I must read it and write it so that it is readable. Atleast this is the end goal.
Don't code just to code. Solve real problems. People waste too much time on toy code. Work on real projects which you get paid for. Grow with real project requirements. Code is better, which is written for other people to consume, not for yourself. You can't learn that writing toy code. Your code quality will be measured by the "WTF's per minute" when others read your code, or you read your own 6+ month old code. Organizing/designing code, that you still understand months later is the challenge. If it passes that, then other people will say it's good code. At this point I'd never start any "Advent of Code" or code problems ever again. But I'm in my prime working age, so that needs to be accounted for.
@@freeo6242 You do make a fair point. I started coding about 2 years ago, and still sometimes my methods of judging progress are a little bit weird. In the early days I thought that writing my own vim config is a statisfying amount of progress. For some time, I was also stuck in the turorial hell. Only recently I got enough confidence to try my own non trivial projects. The confidence to do this slowly build over time when I realized that I am now comfortable with things like reading the docs, using the terminal, getting intimate with a build tool, following a long thread to understand my problem and its solution,...and that I can code without an LSP. These things worked for me like a morale booster, convinced me that I got that dawg in me...that I should work on something more real. But it is a long way before I reach my prime.
You could also try going even further old school and use paper documentation… even keep it in a separate room! There is certainly a peculiar benefit in coding slow and needing to take your time - your memory will adapt and you’ll *have* to learn. Same with writing your design before starting coding, and not relying on fast compilation feedback to catch your errors. I’ve tried this, and it’s an interesting exercise to do every now and then. But I personally have much more *fun* being able to get into a flow and code freely, throwing junk at the screen and using every tool available to catch errors and help me.
@@DarkerCry I wish the idea of a benevolent dictator wasn't so commonly romanticized. Great power doesn't just come with great responsibility, it also comes with dependency hell that becomes the dictator's primary job, no matter your ideals - and if the dictator down-prioritizes the vital dependencies, they're replaced by someone who prioritizes them more... Sorry for that rant, I also think Odin needs more attention.
Well, I don't want to be mean, but I don't see any reason that gives this language real added value: no module/package system with package manager just another imperative language (there aren't even closures and the argument against them makes no sense if Rust has them) there are no algebraic data types or sensible infrastructure for overloading like type classes/interfaces/traits no really well-founded concepts for being memory-safe. the syntax is also a bit weird in some places.
TJ: "I read the entire nvim documentation" Vs Tsoding: "I wanna learn LLVM IR, so I'm gonna use clang to compile C to LLVM IR and just figure it out from there”
@@miguelborges7913 you can definitely mess with it without reading the entire docs tho hahaha Just meant it as, it's the two extremes of messing around/learning ahead
LSPs are a huuuuge help for me. I don't know if I'm a dummy or if it's the adhd but I just can't keep that much data in my head all at once. Having an external reference to the structure of the code is invaluable. Before LSPs really caught on, I would just keep a sketch by hand nearby, but integrating it into the IDE has been magical for me.
@@ITSecNEODifferent people can have different opinions. I agree with the LSP take, I think (other than situations like the comment above) it’s usually to a detriment of productivity, and I’ve been very successful without it for a long time now.
My brain is really fuzzy and I'm struggling a lot to remember exact wordings. So just typing in a few characters saves me a ton of time. However, it also could be, that my brain works that way, because I can get away with that thanks to stuff like LSPs ...
@@dpgwalter I don't usually use a LSP. I noticed my engineers usually get stuck on a problem when they use the LSP as a crutch instead of reading documentation.
His argument was basically "If you just hold the whole code base in your head, that's better". Yes. No argument. But good luck doing it across multiple projects. It was a dumb point.
If you just do small scripts or tasks in python, everything is fine with pip. But yes, as soon as we enter some bigger projects we soon arrive in the dependency hell
@@electric26 dependency hell is not really pip's inherent fault but fault of package & project maintainers. It's always a hell unless you take a very very strict and thoughtful approach in managing your dependencies as well having very good idea around semantic versioning and what it means to everybody when they release package updates. But majority packages nowdays are are written with the go to mantra of "just pip install whatev". Then to make matters even worse often packages are not written well enough to hide their internal implementation details and they often endup bleeding out their dependencies in their exposed interfaces. Naturally all this creates unsolvable problems in situations where a project needs a lot of dependencies as some dependencies will have conflicts between them.
If you’re a C/C++ developer Odin will feel like a more ergonomic version of what you’re used to. The language is still early days but it really is a joy to use. The vendor/batteries included approach is actually nice but where it lacks is the vastness of ecosystem right now. That’s largely just because C/C++ have an enormous head start. But once Odin hits 1.0 and has a much larger base, I wouldn’t at all be surprised if this problem goes away too. As well, Odin’s FFI is good so it’s not like you can’t just take your favorite C/C++ library and use it. It speaks the C ABI so it can talk nicely with anything also speaking the C ABI. It’s not a perfect language. There are bugs in the compiler. Those do get fixed pretty quickly if you file a bug report though. The community is pretty helpful. Be aware that gingerBill himself is definitely a benevolent dictator type. This language is definitely not a democracy. If you don’t like that, and you don’t like the taste choices, you may have a harder time. Odin has a long way to go, but it’s very usable and would make for a great option for basically anyone’s next hobby project at the very least.
@@SaHaRaSquadReminds me of that interview with Bjarne Stroustrup on a CPP podcast more than a year ago. Apparently, the C++ Standards Committee wasn't his choice. It was forced upon him by the companies who've been using C++ for quite some time and decided to gang up on him. It was chaotic from then on 😅
@@isodoubIet Exactly. It's also burdened with symbol soup that's clearly borrowed heavily from Go. Odin is very heavily geared toward graphics, video, and game development. Not that those fields don't benefit from having a focused language, but as a general purpose language, it falls quite flat. I'll take C-style soupless C++ (i.e. no STL, no Boost, occasional template use) over Odin's symbol soup any day. His head's generally in the right place, but the language needs a lot less symbol soup to appeal to me.
10:52 Sublime Text mentioned 😊. My first real job was using SAS for data analysis. Also, no LSP, but I knew all the procedures (functions) and parameters types. Then I wrote a small LSP as a Sublime plugin. Used that for a while thinking it would be faster... It wasn't. And going back then I struggled without. I do understand the appeal to not use an LSP. In my current environment I jump between languages and entire services every few days. I just don't see that happening for me. But now it was brought up here and I think back, I really do miss working without one.
Years and years ago I remember Ginger Bill live streaming some early development of odinlang. Was a joy chatting in his stream then and hearing him talk about what hes doing. Its so crazy seeing how far its gotten.
I felt frustrated at the end of the video. Looks like twitter on TH-cam just clarifying couple of personal opinions and that's it. Didn't got anything about Odin.
@@TankorSmash depends what that language is. If it's a high level language, it offers you performance. If you use a low level language, it offers sanity.
@@TankorSmash They have different design philosophies, I would describe it as: zig makes doing the correct thing hard, but it makes doing the incorrect thing harder. odin makes doing the incorrect thing easy, but it makes doing the correct easier. Zig maximizes explicitness, odin minimizes implicitness. Zig prefers flexibility in places where odin prefers simplicity and intuitiveness (build system, meta programming etc.). zig is more C like in places where odin takes more influence from pascal.
@@TankorSmash I looked at zig before odin, but leaned into odin because, in my opinion, it was easier to read. Also, it felt much more intuitive (coming from C).. so, easier to reason about. That's all personal preference though. Much of what you can do in odin has a 1:1 translation to zig. For example, I know zig has a SoA container much like Odin's #soa directive. They both have the same mentality of: another take on low level design with the advantage of 40+ years of hindsight.
I really like that Odin gives one good reliable way to do a thing in the standard lib rather then 10 packages giving me 10 different ways to do that same thing for a lot of things...and you can always do it differently on your own
Yeah, that’s my only real gripe about Rust TBH. I hate the fact that I start every new project by typing in cargo add serde, cargo add serde_json, cargo add reqwest, cargo add chrono. It just feels like these should be std libraries. Even Tokio, although I mind that less, I don’t see why rust std can’t ship with a basic async runtime for when I just want to make a couple of http calls.
@@aenguswright7336??? There is literally no difference in importing from the stdlib or importing online crates. Also, what is your point here? Stdlib shouldn't contain everything by default, that would blow up the binary sizes. Not everyone needs json, or Async runtimes etc. for their project, why should it be included in the stdlib then? Makes no sense to me. Another pro is, that the language devs have less Code to maintain.
@@ITSecNEO There is huge difference, there are industries where every dependency you take on has to be audited, so it’s massive inconvenience to have more than just the std to audit, beyond that it makes the entire ecosystem extremely vulnerable to supply chain attacks. Also it doesn’t inherently bloat your binary sizes, in C 9/10 times std gets dynamically linked so it literally doesn’t affect anything and rust doesn’t have a stable abi, so there isn’t even the concept of linking an object inside of save rust, so everything is subject to dead code elimination.
@@UnidimensionalPropheticCatgirl No, there are a lot of crates which can be seen as standards for the language. Therefore you only have to audit those ones and not every one. The dependencies are often the same, like serde f.ex. All of those crates are maintained by highly talented people, so there is basically no need for huge auditing. Also, what do you want to audit? If the crates don't use much unsafe blocks or a lot of RCs or ARCs, there is no huge effort needed for auditing. That's the point of Rust, being memory safe by default. I don't get all the artificial Rust hate, it doesn't makes any sense.
Very interesting share ! Thanks I'm currently learning Odin, and it seems like every time I delve into a topic, I'm always amazed at how cleverly things are done in Odin. The more I use Odin, the more I agree with his maxim "Odin is the alternative to C for the joy of programming". I invit any coder to test it for a few weeks. It's an amazing language for coding.
I agree that including any dependency should be a big thing that requires work and an informed opinion . Great interview ! Can't wait to play a bit with Odin.
I'm curious what you think about stuff like the DashMap crate for Rust. It is completely unrealistic for people to implement DashMap themselves because it is a concurrency nightmare and most of the time people will implement it wrong and even if it's right, it'll be slow. But using a RwLock will be substantially slower than a DashMap in most cases. Do you think the Rust standard library is failing for not having its own implementation of DashMap? Do you think people should just accept the price of RwLock except in the rare cases where performance really matters and then people should go and manually install DashMap? Maybe DashMap specifically _should_ be standard library, but there's a lot of borderline stuff where doing it yourself is just finicky and annoying and will result in much slower code that's likely less correct. Like, yes, there are downsides to pulling in dependencies, but there are also a lot of upsides to having good implementations of things available on hand.
There is literally no Problem with the dependencies in Rust. Rust is memory safe by design and the crates are maintained by highly talented peoples. Rusts situation is entirely different from C++ or C. They both are memory unsafe, so it's easy to pull in dependencies which are problematic. But in Rust we get away with most of the memory issues by default, the risk for bad dependencies is highly smaller. It's just wrong to generalize in case of dependencies
@@yaksherAbsolutely right. "Dependencies are bad" is such a L take. Why should we invent the wheel over and over again when we can have one crate for the problem instead, which is maintained by experts for this exact problem. The crate is likely to be a magnitude more safe and efficient than any custom and new implementation by ourselfes. I'm also happy that not everything is in the stdlib, this comes with two pros: the community can contribute to the language and the language devs can focus on the language instead of stdlib features.
@@ITSecNEObecause dependencies are generally very generic. Importing a generic linked list library (for example) will not give you the same control over memory layout as writing your own.
Fun fact: Odin(3) is a tool developed by samsung to flash firmware and custom roms etc to your samsung galaxy device using download mode (was called something else before but i forgotttt) Usually can be acessed by holding down both volume buttons and power at the same time (has to be plugged into a pc from 2018 onwards (i think)
While I'm more in the Zig camp, because it fits my needs simply better, that guy has really stable opinions. Especially his thoughts about dependencies are absolutely correct and important! Thank you for that ihteresting interview!
no the take on the dependencies is garbage, the fact that you don't have a package manager doesn't mean you won't put extern source which in turn is using other external source, so you still "don't know what you are downloading at this point".
@@carpal4489so you don’t have the self control to limit doing dumb things, copy that. At least I have the choice of what is pulled into my project. Most packages are so badly made they have 400 deps you probably have no choice but to allow.
Am I the only one confused by this podcasts format? The intro presents it like this is the episode, only to find out at the end the rest is on discord (presumably paywalled?). It just feels like a bait and switch.
The discord part is them doing Q&A, where people can call in and ask their questions, it’s not open to public since if you let random chatters ask questions their quality is just gonna be low which is annoying for everyone involved, so there is some vetting. but I don’t know why don’t they record it.
Imo the usefulness of LSP depends with what language you are writing. So if you are writing in a typed language, LSP is just a sugarcoat, but if you are writing in a dynamic language, LSP is a must.
@@HalfMonty11TypeScript itself is pretty much just a linter and an LSP on top of JS. I’d argue _having to have_ an LSP to understand the language is a sign that it’s full of overt complexity that could have been avoided.
In Jai you have a combination of the several module things. You have #load which acts the same as #include (though you can scope some things so they are only accessible to that file or module using #scope_file, #scope_module, and #scope_export.) Then you have #import which lets you import a module which can either be a single file, or a directory with a module.jai file that loads the other module related files into it. And with #include it will look in the standard library (which is just a directory named "modules" bundled with the compiler that just has the source files), in the "modules" directory at the root of your project if it exists, and any other directories you may have told the compiler about. Then in if you for example tried to import the module "Foo", then it will look in those directories for a file "Foo.jai" or a directory "Foo" with a module.jai source file in it. In addition to this there is #import,file and #import,dir which lets you specify a path to a module file or directory.
I would still use LSP without autocompletion, LSP has other features that automate things that are not worth wasting time on, for example renaming a symbol that is used in different parts of the code, what do I gain by doing this manually? nothing. Other features like find references and go to the definition are very useful, I don't want to waste time searching through a filetree for that.
honestly having used odin for the past few months, it has been an extremely refreshing language to write. i started with the 1 billion row challenge and found that the standard library and core language had everything i needed and it was simple enough to get up and running in a weekend. even though bill doesn't like lsps, the unofficial one (ols) has been very good (not as good as rust analyzer but more than good enough given how much simpler the language itself is). additionally, the core library has got to be one of the easiest to read i've seen in a while, it was really nice being able to goto definition and actually read the code and understand it (unlike the C++ STL). to me this feels like a logical progression on the "simpler" languages that adds quality of life without the complexity that C++, Rust, and Zig add
C++ went off the rails with the adoption of STL. I stopped at C++ 11 and don't touch any of the newer stuff. I avoid STL and Boost like the plagues that they are. Templates are useful but they shouldn't be used for everything because they turn the language into incomprehensible symbol soup.
@@privacyvalued4134If C++ 11 would have been the last version, I would absolutely love that language. But the current state is a mess, still fun to write, but once you need to read others code the hell begins. That's the reason I ditched C++ in flavour of Rust. But Rust can also get to a messy state in the future with all that new added stuff... Last hope is on Carbon, but they seem to be pretty slow in development
I am surprised Zig was in your complexity list! I think Zig is a surprisingly simple language with well defined solutions over the years to common problems in C (null and pointers for example). Where is the complexity in Zig for you? Another point is the overview page for Odin mentioned in the video is roughly the same length as Zig. Also it seems pretty unfair to place it with C++ I suppose? I am just furthering where my thoughts come from but I am genuinely curious what it is for you.
Golang fixes a lot of the package management issues he expresses. It supports both vendoring and remote packages, the latter of which are/can be an explicit locked version/commit
> "Oh God, that sounds hard!" (RE manually downloading packages) You also are going to be less likely to take on complex, weird, or otherwise shitty dependencies. Which makes it better for everyone.
There are two types of developers: those that look at other developers they consider good, to become like them, and those that don't need others to become good so they develop differently with different standard ways of working. None of them are bad developers.
I don't think anyone that becomes good just does that by themself without taking examples or inspiration, it's pretty much impossible, it is like training an AI on no-data. instead I think the W developer is the one that learn the best from everything they learn and try to come the most optimize solution, that's why I think developers that sets on their safe zones because they think it is comfortable enough are ass developers and will never reach the level of one that always seek to be better.
Man I just started hearing understandable to me things and they were "Let's hop on discord" Eh, regardless was very insightful and ive found something new for myself A lot of thanks
Odin is my current language of choice. It's not perfect, but it fits my style better than any other language I've tried. I like the module level visibility controls. I do think Odin has the wrong default though. Everything is public by default.
Public by default is on purpose because of the amount of times I've had so many issues with things being private all the time and I've not been able to access things without modifying the source code directly. I understand why people "think" private-by-default is a good idea but it really isn't for the actual users of the code. The library writer doesn't really know what I need and is usually wrong too.
@@GingerGames I can see that point. I guess I'm of the mindset that an implementation detail shouldn't be exposed. Since someone will depend on it for something. And I guess that'd just because I've never really questioned semantic versioning. If a library just has a single version number it doesn't matter if new versions have breaking changes.
After watching this, I think I'll be trying out Odinlang. As someone that really likes to know what I'm putting into my projects, pkgs being necessary in some languages for basic functionality drives me nuts. One little package will suddenly add 40 packages.
I'm glad Ginger Bill was born in the right timeline, otherwise would 100% get burned by being this ginger bearded craftsman of the magic we call compilers
I have access to Jai, and I use it frequently. When I began using it I used the "using" statement a lot, but after using it for a while, I calmed down the ways I was using it. It can get a little confusing, it but can be very nice to use from time to time. So now I either use it for structs, or small functions where it is clear what it means, for example: Entity :: struct { position: Vector2; // Sometimes I will make the x and y coordinates here visible in the Entity scope, by using the "using" keyword, but that is not useful in this example. velocity: Vector2; speed: float; } FRICTION :: 40.0; move_on_input :: (using entity: *Entity, delta: float) { Vector2 direction = normalize( get_input_direction() ); if length(direction) > 0 { velocity += direction * speed * delta; } else { velocity *= FRICTION * delta; if length(velocity) < 0.1 then velocity = make_vector2(0, 0); } position += velocity; } You could also have "using" as a separate statement, so you can do a block an in that block you can access the stuff inside. for example: foo :: (a: Vector2) { // ... { using a; // do stuff with x and y. } // ... }
Why would anyone use a language which is not even open sourced? I read Jai everywhere, but the f ing language isn't even available for everyone and therefore only used by a really small group of people only
I'm probably younger than you, and I was taught that term, even if I know the other ones. BBC Bitesize (kids learning website) uses the term speech marks.
Turning off LSP makes you self sufficient. It would appear that doing the grunt work, and things like using the spacebar to tab out lines manually, makes you more consistent.
I removed copilot about a year ago when I noticed that I was no longer thinking about problems anymore and kind of waited 2-3 secs to see what it generates. Realistically I stopped problem solving the problems and found I ended up spending more time trying to debug and fix copilot snippets
Using copilot just felt backwards, we should be writing a solution to a problem and then maybe using AI to rubber duck it after your happy with your tests
Much as I like Rust as a language, I definitely agree with Bill's take on package managers. A sufficiently complex project will likely have multiple versions of the Rand crate, for example, because any crate that supports cryptography will depend on the Rand crate.
Still early in watching, his take on package managers is fascinating, because it says a lot about the development community and not about package managers themselves. Because packages are easy to make, anyone can make them. Because anyone can make them, bad ones get in, but if they happen to be useful despite being poorly optimized, maybe having a bad API, etc, we end up with a worse environment because they become deeply embedded in the ecosystem and make it all worse. Huh. Edit: I should have gone a little farther. I actually disagree with his prototype take. A lot of developers I know understand the difference, but the business forces them to ship without going back and doing a "real" implementation. At best they get to go do a bit of hardening around the first version.
"A little copying is better than a little dependency." And downloading dependencies statically is great for the team's collective sanity. Had to upgrade a server and the Python dependencies last week. What a hassle... Things were broken 3 levels deep in code the application didn't even interact with directly. Semver really is an idealistic contract that gets broken often. Especially if you have a lot of dependencies.
I've noticed that I can embed struct A in struct B, create an instance of struct B, and pass it to a function expecting a struct A parameter, and it appears to work fine. This would appear to give the ability to do something like class extensions in languages like Java or Dart. Not sure yet if this is an antipattern. Would love to hear thoughts of other Odin developers.
the difference is there's no virtual calls (unless you implement them yourself) so that's like Java, but without overiding (and with decent performance)
@2:20 This is not an uncommon opinion at all, boggles my mind that Prime has never heard it before. Rob Pike (and other people on the Go team) say they're more productive not having syntax highlighting/coloring. Again, the same idea: by not leaning on the syntax colors, they find they think about the actual code more.
I'm not saying this about any particular thing point that was made but Prime looked like he entered The Deepest state of Lifechanging thought. 14:35 onwards
@3:00 I have slightly mixed feelings about copilot, but what I'm a bigger fan of is inline chat. Like, I've been using Cursor and for some rote stuff, it's really nice to be able to just tell it to write some code here or modify the code in some specific way. It's much less intrusive than copilot but it gives you have most of the benefits. Like, lately I've been working on a project which is a bot which forwards messages back and forth between two messengers and it's a lot of annoying work with meshing their APIs and most of the code exists in two directions which are conceptually basically the same but can't really be abstracted over due to the details and so it's nice to be able to just paste the code and tell it "rewrite this to be in the other direction" and then it's slightly wrong and I fix it and it's much faster than doing it by hand. I sorta see the vision against autocomplete, but I have two cases I'd make for it - first, if you're doing relatively small projects with a new library where the library does a lot of heavy lifting (i.e., "small thing to talk to an API" type programs, like the bot described above), if the library is sensibly made, you can often find what you need without needing to trawl through documentation just by guessing the approximate name of the method or function. This works especially well in languages like Rust, where knowing the type signature of a function tells you pretty well what you need to give it. - second, good autocomplete encourages me to use longer variable and function names which would otherwise be really annoying to type. I feel like without autocomplete, there's definitely a pressure to pull Linux-style `fcntl` and `prctl` crap (where they couldn't even be bothered to standardize an abbreviation of "control") instead of using descriptive names like `file_control` and `process_control` which can then be typed with fcntl-TAB. An interesting thing I've realized with myself is that I talk to people a lot about code in chat platforms like Discord, where they have nice code blocks but they don't have any autocomplete or whatever at all, for example, which I think ends up being nice because despite using copilot and LSPs and stuff, I still regularly exercise (at least in small amounts) my ability to just... write some code. @19:40 An HTTP server is simple. An HTTPS server is not. And nobody needs an HTTP server these days, they need an HTTPS server, and nobody should be implementing TLS themselves because it will be done wrong. In general like, I see the point with package managers... but also, like... a lot of stuff, it would be really nice to have done right, once, correctly and not reimplemented from scratch. Some of it belongs in the standard library but the standard library can only support so much. The standard library probably shouldn't build sqlx into it though, and I really have no interest in writing a parser for Discord's particular brand of markdown myself. Yes, in a world where people have an infinite amount of capacity to write code, they can implement everything themselves from scratch and for most things this would technically be an improvement. But while for foundational things, it probably makes sense to minimize dependencies, even for things which aren't prototypes, it's not feasible to implement everything yourself. I think it does pretty heavily depend on languages too though. Average JavaScript dependency is probably a lot buggier than average Rust dependency.
This is funny to me. I'm fairly new to the industry so I love all my autocomplete and feel like it saves me time. My dad has been a software dev/architect for 35 years and the other day he's showing me some code (C++ of all things) that he was editing in Notepad++ with no syntax highlighting except bold keywords and in white mode. I have managed to convince him Neovim may be a good idea after he scoffed at having to 'learn IDEs'. What is there to learn?! Older heads built different
22:40 This has fucked me so hard. Didnt know this spent hours figuring out why something didnt build when I made an ETL to get electricity prices for Norway.
I really like the idea of Odin, it sounds great for my use case of computational modelling. Like C but without the footguns, not as complex as Rust or as barmy as C++ and more mature than Zig. But it still needs a lot of work on the compiler; crossing my fingers that they can sort this.
TH-cam keeps defaulting me to Primeagen's videos whenever any other video ends. He is becoming ubiquitous. I go to sleep listening to Under Milk Wood and wake up to hear Primagen excoriating some hapless dev somewhere, or lampooning some 1980's geek satire. I now have keywords emblazoned in my mind. My subconscious has been invaded. This week it was "Quiche-Eaters". I listened for half an hour, semi comatose, to Primagen on Quiche eaters. I have decided that all this is a sign. I am now subscribed to Primagen. But I am curious, has anybody else been MKUltra'd by TH-cam like this?
3 หลายเดือนก่อน +2
> Swizzling: You can do .XXY or .YYZ if you like Rush. Rush mentioned, let's goo 🤘
I higly disagree about the LSP part (and package managers also :D) I recently had to change an old app written in JS using jQuery DataTables. I wanted to enable column sorting - quick google, you add "ordering": true,done. But I wanted to disable it for two columns with just buttons, so I pasted the same there. It didn't work. Quick google, yes, for columns it's called orderable. If I had a good LSP, I would just "discover" those in my IDE in 10s and be done. But no, I need to fire up google to fine the two different spelling. Oh how much fun that is. Also, knowing that seems like a waste of brain power.
idk, it's important for me to enshure my code is correct before even compilation started. It's fine to "know the language", but i don't want to remember all fields of a struct names. Also go-to-defenition is super handy for me. Just easy way to get answer on "oh, what is it?" question. I agree on packages topic. Downloading 350+ packages to be able to know is number even or not (for example) is crazy
@@slawtul no it's not. You can use it indefinitely for free. It nags you to buy it, but that's it. I've been using it for free for almost a decade now.
@@slawtul I'm fine paying tools I use if that means they are actually good, also easy to ignore the popup and use for free, sometimes I spent months before I setup my liscense on new builds...
@@slawtul that's not true. Buying a license is not required. I've been using Sublime for a decade now, and I've never bought it yet. (TH-cam keeps deleting my replies, so if you see more than one by me, that's why.)
@@skaruts Yes, it's required. From a page: "Sublime Text may be downloaded and evaluated for free, however a license must be purchased for continued use." You have been using it for so long without paying cause Sublime has not got a frustrating mechanism asking you to buy a license, like a '30 minutes shutdown mechanism'. That's all.
Sigh... I guess I am just old... I remember sitting on the floor with no less than 3 heavy programming books and a language reference guide. A paper notebook and graph paper, had to have graph paper. This is was pre-RAD IDE. There was no drag and drop GUI design, you spec'd out the x, y pixel positions for just about everything in code which means you had to calculate it on graph paper for every button, label, etc. Intelligent autocomplete helps a lot as well as the online documentation for newbie. But I can see how autocomplete may become annoying to someone intimately familiar with a language.
I don't think Odin will ever be mainstream, as Zig is simply a better C successor. I also don't see the point in using it over C++ for Game Dev, also considering that rust makes huge steps forward in that area too. So where is the point of Odin?
not having xcode autocomplete circa 2019 when i had to use a 4gb macbook air (employer's) to develop in objective c made me a better programmer. not just in terms of learning all syntax, but also gives you continuity in your thought process since you dont have to pause for the autocomplete to write the code youre trying to. autocomplete has been off for me since then!
Ive added a toggle for my LSP autocompletion, with autocompletion off by default. I find forcing myself to actively recall variables and methods 10x speeds up my learning of a library or codebase. If I’m really stuck, ill toggle it on for a sec, but then right off. I basically use autocompletion like flashcards and im never going back. But to each their own :)
@@ITSecNEO lol calm down. No one is forcing you to turn off your auto completion. I just found that by the time I’m able to get up to speed with a library or codebase, the auto completion is almost redundant. I already know what I need to type. Outside of spelling or similar named methods, auto completion is probably the least valuable part of an lsp.
@@hamm8934 So what is the point to disable the LSP then? Auto completion is a nice to have but not important. My point is about Auto Suggestions, as we can see all the available functions for variables without the need to open the docs. Hovering the functions shows the doc definition anyways, so also no need to refer to external docs. Why should we throw all of this benefits away and step back into stone age, if we can be way more productive with a LSP? If your argument would be about Copilot f.ex, I would totally agree, but the LSP is a really important component of a language in my opinion.
@@ITSecNEO you misread my comment. Im not disabling the lsp, just autocompletion while i type. I still have my error checking, go to definition, auto imports, etc.. I just toggled off the autosuggestion while I type. By disabling this, it forces me to actively recall names. I started doing this after my first few white board interviews back in the day where suddenly i was second guessing myself about the names and syntax of basic functions. When youre learning a new codebase, I found auto completion just delays how long it takes to really memorize different functions and methods. And once you know them, youre often not even using autocompletion anymore because you can just type them. If i really need completion, i just hit my completion keybind and it shows the options.
Compiled languages can probably avoid the usage of an LSP, but man would I be dogwater at Python without the help of autocomplete I would be DOA. Damn language has too much freedom to create too many dev-traps.
It's so interesting to hear someone not wanting to use an intellisense/autocomplete. It makes sense to prefer reading through the docs manually, but it is so much slower. It's hard to appreciate the upsides of not having instant access to the docs right where your eyes are already looking Likewise with the dependencies thing, it's absolutely true you open yourself up to being licensed out accidentally, and file size growing but it also gives you universally understood versioning is going to be done manually when you vendor the files into your repo any way. So just look through the source of the library you want and you have none of the downsides mentioned and tons of upsides
As for the dependencies thing: people never read through it if they automatically download it. They just don't. That's human nature. So the downside is that it doesn't happen.
LSP according to copilot: The Language Server Protocol (LSP) is a standardized protocol used to communicate between a code editor or integrated development environment (IDE) and a language server. This protocol enables the editor to provide advanced language features such as auto-completion, go-to-definition, and error checking.
About LSPs - I would love to know how Bill measured that productivity increase. Why i agree with copilot easily - i took me more time fixing what it was trying to help me with than what i got from not having to type that. But for me LSPs were always "i don't have to type whole thing" help and "i know there was something like that" without remembering (and "recently" using) that function. What i hear is - Bill was using LSP as a way to not have to properly learn framework/whatever he was working with. I agree that its wrong usage of LSP. But from my experience and how my brain is working, its way quicker for me to work with LSP especially when i know the lib/stuff i'm working with it. Package managers.... well, he is plainly wrong. I agree with him on what is wrong with current software quality. I disagree with him completely on why its wrong. Its not consequences of package manager - its consequences of bad software management and technical leadership.
As someone who used to have to manually download all dependencies to build a piece of software.... he's categorically wrong about package managers. The industry moved on from that wrong headed thinking because it didn't work.
45:51 we're still the generation creating the ideas based on the previous generations bad decisions. We will be the ones to prove our ideas to be wise or stupid.
Yes, but does Odin have Monads? (I've not written a single line of Odin, yet, and have no idea how Odin does error handling. Not via exceptions, I hope!?)
odin doesn’t have “monad” construct, it handles error handling by multi returns usually, there is also compiler directive that forces you to not discard the error, but nothing is stopping someone from implementing option type.
I don't think there's any shame in asking LLMs specific questions about the features of the language you're using. If you target the language rather than specific implementations of it, they're far more helpful because most language documentation is highly available in their context. If you need to figure out how to do something general, it will tell you how and why it's done that way in the context of the language, sometimes revealing facts under the hood that you would have had to dig through a lot of docs to learn otherwise. I don't think auto-complete is the way, but LLMs are fantastic at playing rubber ducky and grabbing highly available facts quickly.
You can try to find a C API that suits you, then create a binding in Odin. It's rather easy. Have a look in the vendor folder of the Odin source repo to have some great examples
Unless you're making something like figma/photoshop/google-earth in the browser, you're better off using js than a different language compiled to wasm. Wasm needs to load the entire binary then set it up before it can be executed, but js can be executed and finished WHILE the page is still downloading.
Teej over here looking like a sports commentator…
Swagger
I remember it was a primetime video in which you asked the chat something along the lines of "how many of you could code if you turn off LSP?" I took the challenge, put my neovim on hold and created a simple .vimrc file with a single plugin(vim-surround) and started using vim as my primary editor for rust. At the time I was reading the book "Learning Rust With Entirely Too Many Linked Lists", I decided to follow the book in my new vim setup. Based on the experience, I would like to add a few points to your LSP discussion:
1) I see an improvement in my ability to track how types change. LIke when I chain some functional programming constructs over some collection, I can feel what will be the type of the thing inside the closure. Also relying on mentally tracking types forces you to make some sane decisions which makes remembering the types easier. I will know that which variable is a reference an which is owned based on how I am going to use it.
2) It forces me to use the std library docs too often.Coz I use duckduckgo, it has a shortcut where I can search the rust std library docs directly thorugh my url bar, this feature is called 'bangs', It has made me much comfortable with reading the docs. Now I am not afraid of going down that rabbit hole.
3) Because there are no type hints and warnings when I do mistakes, I have to always run `cargo check` and see the compiler error messages. I am now a lot more comfortable when reading compiler error messages.
4) It might be helping me to plan better. So this ones a little tricky. Earlier if I had a variable then I would press tab on it in insert mode to see what methods I have on it and if any of them could be used to achieve something that might bring me closer to achieve the thing that I originally want. Now I have to think and plan about this before I start typing.
5) I like the minimalism of it. When I installed neovim on my arch linux, my adhd kicked in and I spent days configuring it down to the last detail. Now I am rocking a 20 line .vimrc file with a single plugin to write rust, C and python. Disclaimer: I am not working on projects the size of linux kernel with my current setup. My workflow is limited to advent of code problems, college homeworks, ctf's etc. Not very big projects involving a complex directory structure with hundreds of files.
Although I have not done it long enough, but I hope that if I kept doing it then eventually, for my own sanity, I may start writing better code. If my editer is not reading code for me then I must read it and write it so that it is readable. Atleast this is the end goal.
Don't code just to code. Solve real problems.
People waste too much time on toy code. Work on real projects which you get paid for. Grow with real project requirements. Code is better, which is written for other people to consume, not for yourself. You can't learn that writing toy code. Your code quality will be measured by the "WTF's per minute" when others read your code, or you read your own 6+ month old code. Organizing/designing code, that you still understand months later is the challenge. If it passes that, then other people will say it's good code.
At this point I'd never start any "Advent of Code" or code problems ever again. But I'm in my prime working age, so that needs to be accounted for.
@@freeo6242 You do make a fair point. I started coding about 2 years ago, and still sometimes my methods of judging progress are a little bit weird. In the early days I thought that writing my own vim config is a statisfying amount of progress. For some time, I was also stuck in the turorial hell. Only recently I got enough confidence to try my own non trivial projects. The confidence to do this slowly build over time when I realized that I am now comfortable with things like reading the docs, using the terminal, getting intimate with a build tool, following a long thread to understand my problem and its solution,...and that I can code without an LSP. These things worked for me like a morale booster, convinced me that I got that dawg in me...that I should work on something more real.
But it is a long way before I reach my prime.
@@freeo6242 prime would disagree
You could also try going even further old school and use paper documentation… even keep it in a separate room!
There is certainly a peculiar benefit in coding slow and needing to take your time - your memory will adapt and you’ll *have* to learn. Same with writing your design before starting coding, and not relying on fast compilation feedback to catch your errors.
I’ve tried this, and it’s an interesting exercise to do every now and then. But I personally have much more *fun* being able to get into a flow and code freely, throwing junk at the screen and using every tool available to catch errors and help me.
Odin definitely needs more attention, this is great. Plus Bill is a great benevolent dictator for it.
sometimes a project needs a dictator, yeah. see the Linux Kernel.
@@yonas6832 hey, if the dictator is good it's usually the best fit for any project. Very few can do it though.
@@DarkerCry I wish the idea of a benevolent dictator wasn't so commonly romanticized. Great power doesn't just come with great responsibility, it also comes with dependency hell that becomes the dictator's primary job, no matter your ideals - and if the dictator down-prioritizes the vital dependencies, they're replaced by someone who prioritizes them more... Sorry for that rant, I also think Odin needs more attention.
Well, I don't want to be mean, but I don't see any reason that gives this language real added value:
no module/package system with package manager
just another imperative language (there aren't even closures and the argument against them makes no sense if Rust has them)
there are no algebraic data types or sensible infrastructure for overloading like type classes/interfaces/traits
no really well-founded concepts for being memory-safe.
the syntax is also a bit weird in some places.
@@Thyringer then just use something you want to use, Odin has good graphic library support and I like the syntax.
TJ: "I read the entire nvim documentation"
Vs
Tsoding: "I wanna learn LLVM IR, so I'm gonna use clang to compile C to LLVM IR and just figure it out from there”
You can't generate nvim configurations.
@@miguelborges7913 you can definitely mess with it without reading the entire docs tho hahaha
Just meant it as, it's the two extremes of messing around/learning ahead
Ive been using odin for the past month for my voxel game and I've never been happier with a language
He called it Odin so he can claim as the creator of Odin.
Pirate Software is his grandchild
The All-Grandfather
@@plaintext7288😂
nah probably because the-clone-of-jay was way too long
@@carpal4489 Odin started as a Pascal clone. Also who cares.
LSPs are a huuuuge help for me. I don't know if I'm a dummy or if it's the adhd but I just can't keep that much data in my head all at once. Having an external reference to the structure of the code is invaluable. Before LSPs really caught on, I would just keep a sketch by hand nearby, but integrating it into the IDE has been magical for me.
Those are tech influencers, they always need to say something meaningful to get clicks or likes. Even if it's BS like that take for the LSPs
@@ITSecNEODifferent people can have different opinions. I agree with the LSP take, I think (other than situations like the comment above) it’s usually to a detriment of productivity, and I’ve been very successful without it for a long time now.
My brain is really fuzzy and I'm struggling a lot to remember exact wordings. So just typing in a few characters saves me a ton of time. However, it also could be, that my brain works that way, because I can get away with that thanks to stuff like LSPs ...
@@dpgwalter I don't usually use a LSP. I noticed my engineers usually get stuck on a problem when they use the LSP as a crutch instead of reading documentation.
His argument was basically "If you just hold the whole code base in your head, that's better". Yes. No argument. But good luck doing it across multiple projects. It was a dumb point.
It's funny how pip is both the unanimous worst package manager, but also the one that comes to mind as the first example of a useful package manager
If you just do small scripts or tasks in python, everything is fine with pip. But yes, as soon as we enter some bigger projects we soon arrive in the dependency hell
@@ITSecNEOpip's dependency hell is the worst I have ever experienced, both in severity and it consistently happening.
@@ITSecNEO which I guess fits the language
@@electric26 dependency hell is not really pip's inherent fault but fault of package & project maintainers. It's always a hell unless you take a very very strict and thoughtful approach in managing your dependencies as well having very good idea around semantic versioning and what it means to everybody when they release package updates. But majority packages nowdays are are written with the go to mantra of "just pip install whatev". Then to make matters even worse often packages are not written well enough to hide their internal implementation details and they often endup bleeding out their dependencies in their exposed interfaces. Naturally all this creates unsolvable problems in situations where a project needs a lot of dependencies as some dependencies will have conflicts between them.
Pip inherits its simultaneously the best and the worst trait straight from Python.
If you’re a C/C++ developer Odin will feel like a more ergonomic version of what you’re used to. The language is still early days but it really is a joy to use. The vendor/batteries included approach is actually nice but where it lacks is the vastness of ecosystem right now. That’s largely just because C/C++ have an enormous head start. But once Odin hits 1.0 and has a much larger base, I wouldn’t at all be surprised if this problem goes away too. As well, Odin’s FFI is good so it’s not like you can’t just take your favorite C/C++ library and use it. It speaks the C ABI so it can talk nicely with anything also speaking the C ABI. It’s not a perfect language. There are bugs in the compiler. Those do get fixed pretty quickly if you file a bug report though. The community is pretty helpful. Be aware that gingerBill himself is definitely a benevolent dictator type. This language is definitely not a democracy. If you don’t like that, and you don’t like the taste choices, you may have a harder time. Odin has a long way to go, but it’s very usable and would make for a great option for basically anyone’s next hobby project at the very least.
I'd rather have a BDFL in an open source project than design by committee where nothing gets done and yet everything gets added.
@@SaHaRaSquadReminds me of that interview with Bjarne Stroustrup on a CPP podcast more than a year ago.
Apparently, the C++ Standards Committee wasn't his choice. It was forced upon him by the companies who've been using C++ for quite some time and decided to gang up on him. It was chaotic from then on 😅
And it’s a very good thing that Odin is not a democracy
If you're a C developer maybe. If you're used to C++, odin is quite simply too underpowered to be useful.
@@isodoubIet Exactly. It's also burdened with symbol soup that's clearly borrowed heavily from Go. Odin is very heavily geared toward graphics, video, and game development. Not that those fields don't benefit from having a focused language, but as a general purpose language, it falls quite flat. I'll take C-style soupless C++ (i.e. no STL, no Boost, occasional template use) over Odin's symbol soup any day. His head's generally in the right place, but the language needs a lot less symbol soup to appeal to me.
10:52 Sublime Text mentioned 😊. My first real job was using SAS for data analysis. Also, no LSP, but I knew all the procedures (functions) and parameters types. Then I wrote a small LSP as a Sublime plugin. Used that for a while thinking it would be faster... It wasn't. And going back then I struggled without. I do understand the appeal to not use an LSP.
In my current environment I jump between languages and entire services every few days. I just don't see that happening for me. But now it was brought up here and I think back, I really do miss working without one.
I was happy to hear sublime mentioned, thought I was the only one tbh lol
faster than what ?
Years and years ago I remember Ginger Bill live streaming some early development of odinlang. Was a joy chatting in his stream then and hearing him talk about what hes doing. Its so crazy seeing how far its gotten.
I felt frustrated at the end of the video. Looks like twitter on TH-cam just clarifying couple of personal opinions and that's it.
Didn't got anything about Odin.
Here's the best pitch I have for Odin. I picked it up in a weekend by reading the core library.
Happy to hear it's easy to learn. What are the upsides over a language I already know?
@@TankorSmash depends what that language is. If it's a high level language, it offers you performance. If you use a low level language, it offers sanity.
@@Fortun8Fool Lets say I'm coming from Zig
@@TankorSmash They have different design philosophies, I would describe it as: zig makes doing the correct thing hard, but it makes doing the incorrect thing harder. odin makes doing the incorrect thing easy, but it makes doing the correct easier. Zig maximizes explicitness, odin minimizes implicitness. Zig prefers flexibility in places where odin prefers simplicity and intuitiveness (build system, meta programming etc.). zig is more C like in places where odin takes more influence from pascal.
@@TankorSmash I looked at zig before odin, but leaned into odin because, in my opinion, it was easier to read. Also, it felt much more intuitive (coming from C).. so, easier to reason about.
That's all personal preference though. Much of what you can do in odin has a 1:1 translation to zig. For example, I know zig has a SoA container much like Odin's #soa directive.
They both have the same mentality of: another take on low level design with the advantage of 40+ years of hindsight.
I really like that Odin gives one good reliable way to do a thing in the standard lib rather then 10 packages giving me 10 different ways to do that same thing for a lot of things...and you can always do it differently on your own
Yeah, that’s my only real gripe about Rust TBH. I hate the fact that I start every new project by typing in cargo add serde, cargo add serde_json, cargo add reqwest, cargo add chrono. It just feels like these should be std libraries. Even Tokio, although I mind that less, I don’t see why rust std can’t ship with a basic async runtime for when I just want to make a couple of http calls.
@@aenguswright7336 yess, couldn't agree more
@@aenguswright7336??? There is literally no difference in importing from the stdlib or importing online crates. Also, what is your point here? Stdlib shouldn't contain everything by default, that would blow up the binary sizes. Not everyone needs json, or Async runtimes etc. for their project, why should it be included in the stdlib then? Makes no sense to me. Another pro is, that the language devs have less Code to maintain.
@@ITSecNEO There is huge difference, there are industries where every dependency you take on has to be audited, so it’s massive inconvenience to have more than just the std to audit, beyond that it makes the entire ecosystem extremely vulnerable to supply chain attacks. Also it doesn’t inherently bloat your binary sizes, in C 9/10 times std gets dynamically linked so it literally doesn’t affect anything and rust doesn’t have a stable abi, so there isn’t even the concept of linking an object inside of save rust, so everything is subject to dead code elimination.
@@UnidimensionalPropheticCatgirl No, there are a lot of crates which can be seen as standards for the language. Therefore you only have to audit those ones and not every one. The dependencies are often the same, like serde f.ex. All of those crates are maintained by highly talented people, so there is basically no need for huge auditing. Also, what do you want to audit? If the crates don't use much unsafe blocks or a lot of RCs or ARCs, there is no huge effort needed for auditing. That's the point of Rust, being memory safe by default. I don't get all the artificial Rust hate, it doesn't makes any sense.
Lmao Bill's Rush reference went straight over Prime and TJ's heads. I see you, Bill.
I think a lot of people that missed their true calling as baristas went into tech instead, and now we all get to suffer poorly made coffee.
As in java = coffee? That's a good one
Bill brews his own beer.
Very interesting share ! Thanks
I'm currently learning Odin, and it seems like every time I delve into a topic, I'm always amazed at how cleverly things are done in Odin.
The more I use Odin, the more I agree with his maxim "Odin is the alternative to C for the joy of programming".
I invit any coder to test it for a few weeks. It's an amazing language for coding.
I agree that including any dependency should be a big thing that requires work and an informed opinion . Great interview ! Can't wait to play a bit with Odin.
I'm curious what you think about stuff like the DashMap crate for Rust. It is completely unrealistic for people to implement DashMap themselves because it is a concurrency nightmare and most of the time people will implement it wrong and even if it's right, it'll be slow. But using a RwLock will be substantially slower than a DashMap in most cases.
Do you think the Rust standard library is failing for not having its own implementation of DashMap? Do you think people should just accept the price of RwLock except in the rare cases where performance really matters and then people should go and manually install DashMap?
Maybe DashMap specifically _should_ be standard library, but there's a lot of borderline stuff where doing it yourself is just finicky and annoying and will result in much slower code that's likely less correct.
Like, yes, there are downsides to pulling in dependencies, but there are also a lot of upsides to having good implementations of things available on hand.
There is literally no Problem with the dependencies in Rust. Rust is memory safe by design and the crates are maintained by highly talented peoples. Rusts situation is entirely different from C++ or C. They both are memory unsafe, so it's easy to pull in dependencies which are problematic. But in Rust we get away with most of the memory issues by default, the risk for bad dependencies is highly smaller. It's just wrong to generalize in case of dependencies
@@yaksherAbsolutely right. "Dependencies are bad" is such a L take. Why should we invent the wheel over and over again when we can have one crate for the problem instead, which is maintained by experts for this exact problem. The crate is likely to be a magnitude more safe and efficient than any custom and new implementation by ourselfes. I'm also happy that not everything is in the stdlib, this comes with two pros: the community can contribute to the language and the language devs can focus on the language instead of stdlib features.
@@ITSecNEObecause dependencies are generally very generic. Importing a generic linked list library (for example) will not give you the same control over memory layout as writing your own.
Fun fact: Odin(3) is a tool developed by samsung to flash firmware and custom roms etc to your samsung galaxy device using download mode (was called something else before but i forgotttt) Usually can be acessed by holding down both volume buttons and power at the same time (has to be plugged into a pc from 2018 onwards (i think)
I believe it was a leaked internal tool. I may be mistaken.
they’re “hot takes” because the takes are fire
Love what he said about package managers. When I was learning it felt very strange to just download a fuck ton of code that I know nothing about.
While I'm more in the Zig camp, because it fits my needs simply better, that guy has really stable opinions. Especially his thoughts about dependencies are absolutely correct and important! Thank you for that ihteresting interview!
no the take on the dependencies is garbage, the fact that you don't have a package manager doesn't mean you won't put extern source which in turn is using other external source, so you still "don't know what you are downloading at this point".
@@carpal4489 It's not garbage...it's daily routine for me to clean up dependency hells
@@carpal4489You seem like a little hater boy
@@Kingbubs353 i just have an opinion, at this point you sound like a communist censor
@@carpal4489so you don’t have the self control to limit doing dumb things, copy that.
At least I have the choice of what is pulled into my project. Most packages are so badly made they have 400 deps you probably have no choice but to allow.
prime is questioning his life at 14:30
Mhmm
Am I the only one confused by this podcasts format? The intro presents it like this is the episode, only to find out at the end the rest is on discord (presumably paywalled?). It just feels like a bait and switch.
The discord part is them doing Q&A, where people can call in and ask their questions, it’s not open to public since if you let random chatters ask questions their quality is just gonna be low which is annoying for everyone involved, so there is some vetting. but I don’t know why don’t they record it.
Imo the usefulness of LSP depends with what language you are writing.
So if you are writing in a typed language, LSP is just a sugarcoat, but if you are writing in a dynamic language, LSP is a must.
Why is it a must for dynamic languages?
@@TwilightTrekker1 because he said so
🤔dynamic languages don't need an LSP, you might need it if your project is big/complex enough
statically typed languages should use LSPs
Yeah, id agree. I can seen no lsp with Rust or Odin being possible but no lsp with Typescript sounds like hell on earth
@@HalfMonty11TypeScript itself is pretty much just a linter and an LSP on top of JS. I’d argue _having to have_ an LSP to understand the language is a sign that it’s full of overt complexity that could have been avoided.
In Jai you have a combination of the several module things.
You have #load which acts the same as #include (though you can scope some things so they are only accessible to that file or module using #scope_file, #scope_module, and #scope_export.) Then you have #import which lets you import a module which can either be a single file, or a directory with a module.jai file that loads the other module related files into it.
And with #include it will look in the standard library (which is just a directory named "modules" bundled with the compiler that just has the source files), in the "modules" directory at the root of your project if it exists, and any other directories you may have told the compiler about. Then in if you for example tried to import the module "Foo", then it will look in those directories for a file "Foo.jai" or a directory "Foo" with a module.jai source file in it.
In addition to this there is #import,file and #import,dir which lets you specify a path to a module file or directory.
I would still use LSP without autocompletion, LSP has other features that automate things that are not worth wasting time on, for example renaming a symbol that is used in different parts of the code, what do I gain by doing this manually? nothing. Other features like find references and go to the definition are very useful, I don't want to waste time searching through a filetree for that.
I appreciated the rush reference Bill
honestly having used odin for the past few months, it has been an extremely refreshing language to write. i started with the 1 billion row challenge and found that the standard library and core language had everything i needed and it was simple enough to get up and running in a weekend. even though bill doesn't like lsps, the unofficial one (ols) has been very good (not as good as rust analyzer but more than good enough given how much simpler the language itself is). additionally, the core library has got to be one of the easiest to read i've seen in a while, it was really nice being able to goto definition and actually read the code and understand it (unlike the C++ STL). to me this feels like a logical progression on the "simpler" languages that adds quality of life without the complexity that C++, Rust, and Zig add
C++ went off the rails with the adoption of STL. I stopped at C++ 11 and don't touch any of the newer stuff. I avoid STL and Boost like the plagues that they are. Templates are useful but they shouldn't be used for everything because they turn the language into incomprehensible symbol soup.
@@privacyvalued4134If C++ 11 would have been the last version, I would absolutely love that language. But the current state is a mess, still fun to write, but once you need to read others code the hell begins. That's the reason I ditched C++ in flavour of Rust. But Rust can also get to a messy state in the future with all that new added stuff... Last hope is on Carbon, but they seem to be pretty slow in development
I am surprised Zig was in your complexity list! I think Zig is a surprisingly simple language with well defined solutions over the years to common problems in C (null and pointers for example). Where is the complexity in Zig for you? Another point is the overview page for Odin mentioned in the video is roughly the same length as Zig. Also it seems pretty unfair to place it with C++ I suppose? I am just furthering where my thoughts come from but I am genuinely curious what it is for you.
Golang fixes a lot of the package management issues he expresses. It supports both vendoring and remote packages, the latter of which are/can be an explicit locked version/commit
> "Oh God, that sounds hard!" (RE manually downloading packages)
You also are going to be less likely to take on complex, weird, or otherwise shitty dependencies.
Which makes it better for everyone.
Still, when Odin becomes mainstream, people will probably create their own package managers like they did with Go (it was a nightmare).
There are two types of developers: those that look at other developers they consider good, to become like them, and those that don't need others to become good so they develop differently with different standard ways of working. None of them are bad developers.
The latter usually started out life as the former, and vice versa.
W take
I don't think anyone that becomes good just does that by themself without taking examples or inspiration, it's pretty much impossible, it is like training an AI on no-data.
instead I think the W developer is the one that learn the best from everything they learn and try to come the most optimize solution, that's why I think developers that sets on their safe zones because they think it is comfortable enough are ass developers and will never reach the level of one that always seek to be better.
Man
I just started hearing understandable to me things and they were "Let's hop on discord"
Eh, regardless was very insightful and ive found something new for myself
A lot of thanks
Odin is my current language of choice. It's not perfect, but it fits my style better than any other language I've tried.
I like the module level visibility controls. I do think Odin has the wrong default though. Everything is public by default.
Public by default is on purpose because of the amount of times I've had so many issues with things being private all the time and I've not been able to access things without modifying the source code directly. I understand why people "think" private-by-default is a good idea but it really isn't for the actual users of the code. The library writer doesn't really know what I need and is usually wrong too.
@@GingerGames I can see that point. I guess I'm of the mindset that an implementation detail shouldn't be exposed. Since someone will depend on it for something. And I guess that'd just because I've never really questioned semantic versioning. If a library just has a single version number it doesn't matter if new versions have breaking changes.
After watching this, I think I'll be trying out Odinlang. As someone that really likes to know what I'm putting into my projects, pkgs being necessary in some languages for basic functionality drives me nuts. One little package will suddenly add 40 packages.
Man never knew he was a physicist!
I'm glad Ginger Bill was born in the right timeline, otherwise would 100% get burned by being this ginger bearded craftsman of the magic we call compilers
Damn, my man is cooking with so many spicy takes that I want to give him an honorary Indian citizenship
Except he really doesn't like dookie on his food😅😅pun intended
I have access to Jai, and I use it frequently. When I began using it I used the "using" statement a lot, but after using it for a while, I calmed down the ways I was using it. It can get a little confusing, it but can be very nice to use from time to time. So now I either use it for structs, or small functions where it is clear what it means, for example:
Entity :: struct {
position: Vector2; // Sometimes I will make the x and y coordinates here visible in the Entity scope, by using the "using" keyword, but that is not useful in this example.
velocity: Vector2;
speed: float;
}
FRICTION :: 40.0;
move_on_input :: (using entity: *Entity, delta: float) {
Vector2 direction = normalize( get_input_direction() );
if length(direction) > 0 {
velocity += direction * speed * delta;
} else {
velocity *= FRICTION * delta;
if length(velocity) < 0.1 then velocity = make_vector2(0, 0);
}
position += velocity;
}
You could also have "using" as a separate statement, so you can do a block an in that block you can access the stuff inside. for example:
foo :: (a: Vector2) {
// ...
{
using a;
// do stuff with x and y.
}
// ...
}
Why would anyone use a language which is not even open sourced? I read Jai everywhere, but the f ing language isn't even available for everyone and therefore only used by a really small group of people only
Because it's a good language. And if you doing mostly solo projects being "closed" is not a big issue.
I'm a Brit, and not so young, and I have never heard of speech marks. Sounded very weird.
I'm probably younger than you, and I was taught that term, even if I know the other ones. BBC Bitesize (kids learning website) uses the term speech marks.
Turning off LSP makes you self sufficient.
It would appear that doing the grunt work, and things like using the spacebar to tab out lines manually, makes you more consistent.
Cackling
Teej has a great idle animation. Probably powered by Odin.
Minimalist. No IDE. No Package Managers. No Methods. 40% in I’m in happy land…
I removed copilot about a year ago when I noticed that I was no longer thinking about problems anymore and kind of waited 2-3 secs to see what it generates.
Realistically I stopped problem solving the problems and found I ended up spending more time trying to debug and fix copilot snippets
Using copilot just felt backwards, we should be writing a solution to a problem and then maybe using AI to rubber duck it after your happy with your tests
Much as I like Rust as a language, I definitely agree with Bill's take on package managers. A sufficiently complex project will likely have multiple versions of the Rand crate, for example, because any crate that supports cryptography will depend on the Rand crate.
Still early in watching, his take on package managers is fascinating, because it says a lot about the development community and not about package managers themselves.
Because packages are easy to make, anyone can make them. Because anyone can make them, bad ones get in, but if they happen to be useful despite being poorly optimized, maybe having a bad API, etc, we end up with a worse environment because they become deeply embedded in the ecosystem and make it all worse.
Huh.
Edit: I should have gone a little farther. I actually disagree with his prototype take. A lot of developers I know understand the difference, but the business forces them to ship without going back and doing a "real" implementation. At best they get to go do a bit of hardening around the first version.
"A little copying is better than a little dependency."
And downloading dependencies statically is great for the team's collective sanity.
Had to upgrade a server and the Python dependencies last week. What a hassle... Things were broken 3 levels deep in code the application didn't even interact with directly.
Semver really is an idealistic contract that gets broken often. Especially if you have a lot of dependencies.
Great video. Now, I wanna try Odin.
Let the bikeshedding about LSP-s begin in the YT comments!
I've noticed that I can embed struct A in struct B, create an instance of struct B, and pass it to a function expecting a struct A parameter, and it appears to work fine. This would appear to give the ability to do something like class extensions in languages like Java or Dart. Not sure yet if this is an antipattern. Would love to hear thoughts of other Odin developers.
the difference is there's no virtual calls (unless you implement them yourself)
so that's like Java, but without overiding (and with decent performance)
I agree with the package manager take, but im still going to use one, im making an app for some people to interact with a database not the mars rover
And you needed a package manager to download something to interface with a database? And I don't ship things on Mars either.
@@GingerGames it's a mobile app so yes it has a package manager out of the box
@@GingerGames and it uses yaml 😂
@@martinseal1987 that didn't answer my question.
@@martinseal1987 that didn't answer my question.
@2:20 This is not an uncommon opinion at all, boggles my mind that Prime has never heard it before. Rob Pike (and other people on the Go team) say they're more productive not having syntax highlighting/coloring. Again, the same idea: by not leaning on the syntax colors, they find they think about the actual code more.
I'm not saying this about any particular thing point that was made but Prime looked like he entered The Deepest state of Lifechanging thought. 14:35 onwards
@3:00 I have slightly mixed feelings about copilot, but what I'm a bigger fan of is inline chat. Like, I've been using Cursor and for some rote stuff, it's really nice to be able to just tell it to write some code here or modify the code in some specific way. It's much less intrusive than copilot but it gives you have most of the benefits.
Like, lately I've been working on a project which is a bot which forwards messages back and forth between two messengers and it's a lot of annoying work with meshing their APIs and most of the code exists in two directions which are conceptually basically the same but can't really be abstracted over due to the details and so it's nice to be able to just paste the code and tell it "rewrite this to be in the other direction" and then it's slightly wrong and I fix it and it's much faster than doing it by hand.
I sorta see the vision against autocomplete, but I have two cases I'd make for it
- first, if you're doing relatively small projects with a new library where the library does a lot of heavy lifting (i.e., "small thing to talk to an API" type programs, like the bot described above), if the library is sensibly made, you can often find what you need without needing to trawl through documentation just by guessing the approximate name of the method or function. This works especially well in languages like Rust, where knowing the type signature of a function tells you pretty well what you need to give it.
- second, good autocomplete encourages me to use longer variable and function names which would otherwise be really annoying to type. I feel like without autocomplete, there's definitely a pressure to pull Linux-style `fcntl` and `prctl` crap (where they couldn't even be bothered to standardize an abbreviation of "control") instead of using descriptive names like `file_control` and `process_control` which can then be typed with fcntl-TAB.
An interesting thing I've realized with myself is that I talk to people a lot about code in chat platforms like Discord, where they have nice code blocks but they don't have any autocomplete or whatever at all, for example, which I think ends up being nice because despite using copilot and LSPs and stuff, I still regularly exercise (at least in small amounts) my ability to just... write some code.
@19:40 An HTTP server is simple. An HTTPS server is not. And nobody needs an HTTP server these days, they need an HTTPS server, and nobody should be implementing TLS themselves because it will be done wrong. In general like, I see the point with package managers... but also, like... a lot of stuff, it would be really nice to have done right, once, correctly and not reimplemented from scratch.
Some of it belongs in the standard library but the standard library can only support so much. The standard library probably shouldn't build sqlx into it though, and I really have no interest in writing a parser for Discord's particular brand of markdown myself. Yes, in a world where people have an infinite amount of capacity to write code, they can implement everything themselves from scratch and for most things this would technically be an improvement. But while for foundational things, it probably makes sense to minimize dependencies, even for things which aren't prototypes, it's not feasible to implement everything yourself.
I think it does pretty heavily depend on languages too though. Average JavaScript dependency is probably a lot buggier than average Rust dependency.
This is funny to me. I'm fairly new to the industry so I love all my autocomplete and feel like it saves me time. My dad has been a software dev/architect for 35 years and the other day he's showing me some code (C++ of all things) that he was editing in Notepad++ with no syntax highlighting except bold keywords and in white mode. I have managed to convince him Neovim may be a good idea after he scoffed at having to 'learn IDEs'. What is there to learn?! Older heads built different
daaamn that suit
Had no idea Ginger Bill hated beetroots!
Faster without IDE autocomplete? My personal experience is I agree. Many autocomplete suggestions are highly inefficient.
22:40 This has fucked me so hard. Didnt know this spent hours figuring out why something didnt build when I made an ETL to get electricity prices for Norway.
I really like the idea of Odin, it sounds great for my use case of computational modelling. Like C but without the footguns, not as complex as Rust or as barmy as C++ and more mature than Zig. But it still needs a lot of work on the compiler; crossing my fingers that they can sort this.
Can’t find episode one? You have a dedicated channel or playlist somewhere?
I think it's called so I talked to Chris lattner. Let me rename it properly and make a playlist
TH-cam keeps defaulting me to Primeagen's videos whenever any other video ends. He is becoming ubiquitous. I go to sleep listening to Under Milk Wood and wake up to hear Primagen excoriating some hapless dev somewhere, or lampooning some 1980's geek satire. I now have keywords emblazoned in my mind. My subconscious has been invaded. This week it was "Quiche-Eaters". I listened for half an hour, semi comatose, to Primagen on Quiche eaters. I have decided that all this is a sign. I am now subscribed to Primagen. But I am curious, has anybody else been MKUltra'd by TH-cam like this?
> Swizzling: You can do .XXY or .YYZ if you like Rush.
Rush mentioned, let's goo 🤘
I higly disagree about the LSP part (and package managers also :D) I recently had to change an old app written in JS using jQuery DataTables. I wanted to enable column sorting - quick google, you add "ordering": true,done. But I wanted to disable it for two columns with just buttons, so I pasted the same there. It didn't work. Quick google, yes, for columns it's called orderable.
If I had a good LSP, I would just "discover" those in my IDE in 10s and be done. But no, I need to fire up google to fine the two different spelling. Oh how much fun that is. Also, knowing that seems like a waste of brain power.
Electron users in shambles 😂
They should use Tauri instead 😉
TJ is an excellent interviewer
I value those pauses even when I "know what I'm doing". There's always context to examine. Especially with loops.
idk, it's important for me to enshure my code is correct before even compilation started. It's fine to "know the language", but i don't want to remember all fields of a struct names.
Also go-to-defenition is super handy for me. Just easy way to get answer on "oh, what is it?" question.
I agree on packages topic. Downloading 350+ packages to be able to know is number even or not (for example) is crazy
I am also using Sublime Text without autocomplete and love it
I do not know why these two smart guys think Sublime Text is free :| (buying license is required)
@@slawtul no it's not. You can use it indefinitely for free. It nags you to buy it, but that's it. I've been using it for free for almost a decade now.
@@slawtul I'm fine paying tools I use if that means they are actually good, also easy to ignore the popup and use for free, sometimes I spent months before I setup my liscense on new builds...
@@slawtul that's not true. Buying a license is not required. I've been using Sublime for a decade now, and I've never bought it yet.
(TH-cam keeps deleting my replies, so if you see more than one by me, that's why.)
@@skaruts Yes, it's required. From a page: "Sublime Text may be downloaded and evaluated for free, however a license must be purchased for continued use." You have been using it for so long without paying cause Sublime has not got a frustrating mechanism asking you to buy a license, like a '30 minutes shutdown mechanism'. That's all.
Excellent!
Ginger Bill needs to promote ODIN more
this is a guy that knows his sacrifices and keeps on with his life
Well, Learning Odin is back on the todo list. Thanks guys. :D
We English sound better because we actually pronounce our "t"s. Then proceeds to put a "k" on the end of words ending in "ing". 😂
Sigh... I guess I am just old... I remember sitting on the floor with no less than 3 heavy programming books and a language reference guide. A paper notebook and graph paper, had to have graph paper. This is was pre-RAD IDE. There was no drag and drop GUI design, you spec'd out the x, y pixel positions for just about everything in code which means you had to calculate it on graph paper for every button, label, etc. Intelligent autocomplete helps a lot as well as the online documentation for newbie. But I can see how autocomplete may become annoying to someone intimately familiar with a language.
Odin is getting more popular and got more attention 😅
I don't think Odin will ever be mainstream, as Zig is simply a better C successor. I also don't see the point in using it over C++ for Game Dev, also considering that rust makes huge steps forward in that area too. So where is the point of Odin?
@@ITSecNEO code readability
Finally I was waiting for this
not having xcode autocomplete circa 2019 when i had to use a 4gb macbook air (employer's) to develop in objective c made me a better programmer. not just in terms of learning all syntax, but also gives you continuity in your thought process since you dont have to pause for the autocomplete to write the code youre trying to. autocomplete has been off for me since then!
Ive added a toggle for my LSP autocompletion, with autocompletion off by default.
I find forcing myself to actively recall variables and methods 10x speeds up my learning of a library or codebase.
If I’m really stuck, ill toggle it on for a sec, but then right off. I basically use autocompletion like flashcards and im never going back.
But to each their own :)
I call it BS and placebo, but yep, each their own I guess
@@ITSecNEO lol calm down. No one is forcing you to turn off your auto completion.
I just found that by the time I’m able to get up to speed with a library or codebase, the auto completion is almost redundant. I already know what I need to type. Outside of spelling or similar named methods, auto completion is probably the least valuable part of an lsp.
@@hamm8934 So what is the point to disable the LSP then? Auto completion is a nice to have but not important. My point is about Auto Suggestions, as we can see all the available functions for variables without the need to open the docs. Hovering the functions shows the doc definition anyways, so also no need to refer to external docs. Why should we throw all of this benefits away and step back into stone age, if we can be way more productive with a LSP? If your argument would be about Copilot f.ex, I would totally agree, but the LSP is a really important component of a language in my opinion.
@@ITSecNEO you misread my comment. Im not disabling the lsp, just autocompletion while i type. I still have my error checking, go to definition, auto imports, etc.. I just toggled off the autosuggestion while I type. By disabling this, it forces me to actively recall names. I started doing this after my first few white board interviews back in the day where suddenly i was second guessing myself about the names and syntax of basic functions.
When youre learning a new codebase, I found auto completion just delays how long it takes to really memorize different functions and methods. And once you know them, youre often not even using autocompletion anymore because you can just type them.
If i really need completion, i just hit my completion keybind and it shows the options.
@@hamm8934 Ahhh my fault, sorry. That makes sense, I really thought you disabled the whole LSP. Was a little bit late yesterday haha
Compiled languages can probably avoid the usage of an LSP, but man would I be dogwater at Python without the help of autocomplete I would be DOA. Damn language has too much freedom to create too many dev-traps.
Great episode.
It's so interesting to hear someone not wanting to use an intellisense/autocomplete. It makes sense to prefer reading through the docs manually, but it is so much slower.
It's hard to appreciate the upsides of not having instant access to the docs right where your eyes are already looking
Likewise with the dependencies thing, it's absolutely true you open yourself up to being licensed out accidentally, and file size growing but it also gives you universally understood versioning is going to be done manually when you vendor the files into your repo any way. So just look through the source of the library you want and you have none of the downsides mentioned and tons of upsides
It's slower in the short term, but you actually start learning and retaining the code base in your memory. So it is a lot quicker in the long run.
As for the dependencies thing: people never read through it if they automatically download it. They just don't. That's human nature. So the downside is that it doesn't happen.
@@GingerGames We've had very different experiences, I respect that!
i still think i would rather a package manager, sure nothing's perfect but I think there are more pros than cons
LSP according to copilot: The Language Server Protocol (LSP) is a standardized protocol used to communicate between a code editor or integrated development environment (IDE) and a language server. This protocol enables the editor to provide advanced language features such as auto-completion, go-to-definition, and error checking.
About LSPs - I would love to know how Bill measured that productivity increase.
Why i agree with copilot easily - i took me more time fixing what it was trying to help me with than what i got from not having to type that. But for me LSPs were always "i don't have to type whole thing" help and "i know there was something like that" without remembering (and "recently" using) that function.
What i hear is - Bill was using LSP as a way to not have to properly learn framework/whatever he was working with. I agree that its wrong usage of LSP. But from my experience and how my brain is working, its way quicker for me to work with LSP especially when i know the lib/stuff i'm working with it.
Package managers.... well, he is plainly wrong. I agree with him on what is wrong with current software quality. I disagree with him completely on why its wrong. Its not consequences of package manager - its consequences of bad software management and technical leadership.
Can we access the second part of the discussion somewhere ?
As someone who used to have to manually download all dependencies to build a piece of software.... he's categorically wrong about package managers. The industry moved on from that wrong headed thinking because it didn't work.
45:51 we're still the generation creating the ideas based on the previous generations bad decisions. We will be the ones to prove our ideas to be wise or stupid.
Yes, but does Odin have Monads? (I've not written a single line of Odin, yet, and have no idea how Odin does error handling. Not via exceptions, I hope!?)
odin doesn’t have “monad” construct, it handles error handling by multi returns usually, there is also compiler directive that forces you to not discard the error, but nothing is stopping someone from implementing option type.
I like Odin, lsp a u c k a.
I don't think there's any shame in asking LLMs specific questions about the features of the language you're using. If you target the language rather than specific implementations of it, they're far more helpful because most language documentation is highly available in their context. If you need to figure out how to do something general, it will tell you how and why it's done that way in the context of the language, sometimes revealing facts under the hood that you would have had to dig through a lot of docs to learn otherwise. I don't think auto-complete is the way, but LLMs are fantastic at playing rubber ducky and grabbing highly available facts quickly.
I really wanna use Odin. The thing that stops me is the lack of high level websocket client.
You can try to find a C API that suits you, then create a binding in Odin. It's rather easy. Have a look in the vendor folder of the Odin source repo to have some great examples
I just cant really not use al lsp mebacues i make so many tyopes
The North American accents is closer to older English.
Does this mean as a new programmer I should follow this approach or just keep following cs50p
a package is a collection modules
YAML is just a superset of JSON
can u use odin for webdev? like a frontend for calling wasm?
I don’t think so, but if you find something to do that, let me know. I would like to use this too 😊
they allow you to compile into wasm, and their vendor library includes wasm package for making calling js and wgl in wasm easier.
Unless you're making something like figma/photoshop/google-earth in the browser, you're better off using js than a different language compiled to wasm.
Wasm needs to load the entire binary then set it up before it can be executed, but js can be executed and finished WHILE the page is still downloading.
I still don't get why we can't infer the package name from the directory name??