Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Post
  • Reply
DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
here's some terrible programmer wisdom: never write an internal library with the intent of open sourcing it. you'll over engineer it and it wont be useful or good and it wont get opened sourced and everyone will hate you.

Adbot
ADBOT LOVES YOU

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder

prisoner of waffles posted:

I have awful half-assed advice for shoegaze about looking for work with rust / systems programming

go look at mozilla, maybe introduce yourself on IRC / steal an bug from their bug tracker and work on it, especially once you feel okay doin' thangs in C++

I contributed exactly 1 refactoring of an image decoder. when people watch extremely inefficient moving pictures of dumb things on the internet in an browser, they are running my terrible code (patched up by people more familiar with how to validate changes through firefox's extensive test suite(s))

this advice is exactly as half-assed as it sounds and I'm sure everyone else who wants a job programming rust is also quite aware that mozilla is a good place to get one but I'm pretty sure shoegaze can Actually Slang Code so

so i've been working really really hard on my terrible functional programming library in rust and i'd be lying if there isn't a small part of me that idly fantasizes about being contacted by mozilla to come work for them because it's so cool. but that will never happen.

but yeah honestly i'm going to try contributing to mozilla/rust projects with the explicit purpose of getting a job working in rust, but it wont be my primary focus because that's a lovely plan.

speaking of my functional programming library: i think i'm basically stuck. my enum based representation is seriously ugly and while it's good enough for a blog post on the subject of HKTs in rust, it's not sufficient for actual usage. so, i've spent the last two weeks trying to build a lazy evaluator that builds up a series of computations over kinds and then executes them.

I got this working, fully on the stack without boxing or anything, but the resulting interface is just not what I want. So, I'm going to give up on this until GATs are available. However, I have enough content for an interesting blog post so that's what I'm gonna do, and I'll resurrect this effort when GATs are out.

DONT THREAD ON ME fucked around with this message at 16:50 on Jul 17, 2018

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder

gonadic io posted:

hi im gonadic io and im a terrible programmer. my current hobby project is rust code running on an arduino which is talking to a magnetometer

Final plan is a physical compass(a la pirates of the carribbean) that points towards the nearest open coffee shop. yes this would be 10 million times easier as an app but that's not the terrible programmer way

that's awesome.

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
ctps: about to get murdered in this meeting.

basically, i set up our sso configuration a while back. i did the needful. however, our entire authentication/user model just doesn't work with sso and i've been very clear that the system is super messy and really not ready for actual users.

annnnyhow, a major client is getting on-boarded and it turns out somebody told them we have a functioning enterprise sso system. last status update i gave was "yeah it works for internal users but that's it until somebody tells me to do more work." and i'm getting messages asking "why doesn't it work", etc. (it's not as lovely as it sounds, totally not my fault but i'm not getting blamed, yet).

if i werent so checked out i'd be stressed but i just don't give a poo poo.

DONT THREAD ON ME fucked around with this message at 18:54 on Jul 17, 2018

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
yep this sucks

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
seriously considering giving school another go atm. obviously to pursue at least a masters but if i'm gonna do it i guess i should do a phd. i'd have to do most of undergrad though, which would be costly. and weird.

DONT THREAD ON ME fucked around with this message at 02:39 on Jul 18, 2018

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder

moonshine is...... posted:

terrible python/c programmer checking in. Will be a terrible rust programmer when the ide situation feels better.


i'm fine with intellij rust. the big missing feature is intellij refactoring. i find this to be the most painful part of rust. adding a single type parameter or lifetime to a trait is painful, even in my relatively small projects. i cant imagine how annoying it is to modify traits in a larger project (although i guess good modular design helps here).

i've found refactoring to be so painful that i've started building very small vertical prototypes before building a component. which is honestly a really good thing and something i wish i'd started doing sooner.

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
yeah i don’t know what im talking about. i think i just read something stupid about masters being the new bachelors or whatever. i dont know much about academia.

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
i just want to get the most bang for my buck is what im saying

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder

akadajet posted:

i saw the same one at work with '.net' and then again as 'java'

it honestly probably applies to anything

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
fantastic news everyone!! you'll all be excited to know that my HKT embedding in rust is working without the terrible overhead of packing every possible kind into a single enum. the trick was to model computations over kinds as what is basically lazy iterator with a special evaluator built in.

code:
    #[test]
    fn test_vec_functor() {
        let e = Vec::<i32>::eval()
            .map(|i| i * 2)
            .map(|i| i * 2)
            .map(|i| format!{"{:?}", i});

        // operation is constructed on the stack, so, typeof e is:
        // `functor<'_, VecKind, String,
        //         functor<'_, VecKind, i32, [closure@src/sandbox/lazy8.rs:377:18: 377:27],
        //                functor<'_, VecKind, i32, [closure@src/sandbox/lazy8.rs:376:18: 376:27],
        //                       Head<'_, VecKind, i32>>>>`
        assert_eq!(e.run(vec![1,2,3]), vec!["4".to_owned(), "8".to_owned(), "12".to_owned()]);
        assert_eq!(e.run(vec![3,2,1]),  vec!["12".to_owned(), "8".to_owned(), "4".to_owned()])
    }
performance is not too bad!
code:
// i know nothing about benchmarking so this probably sucks!
    #[bench]
    fn bench_vec_map_native(b: &mut Bencher) {
        b.iter(|| {
            let result = vec![1, 2, 3]
                .into_iter()
                .map(|i| i * 2)
                .map(|i| i * 2)
                .map(|i| format!("{:?}", i))
                .collect::<Vec<String>>();

            let result2 = vec![1, 2, 3]
                .into_iter()
                .map(|i| i * 2)
                .map(|i| i * 2)
                .map(|i| format!("{:?}", i))
                .collect::<Vec<String>>();

            assert_eq!(result, result2)
        });
    }

    #[bench]
    fn bench_vec_map_from_functor(b: &mut Bencher) {
        let h = Vec::<i32>::eval()
            .map(|i| i * 2)
            .map(|i| i * 2)
            .map(|i| format!{"{:?}", i});

        b.iter(|| {
            let result = h.run(vec![1, 2, 3]);
            let result2 = h.run(vec![1, 2, 3]);
            assert_eq!(result, result2)
        })
    }

test sandbox::lazy8::tests::bench_vec_map_from_functor    ... bench:         857 ns/iter (+/- 80)
test sandbox::lazy8::tests::bench_vec_map_native          ... bench:         666 ns/iter (+/- 103)
the difference is constant, (i think: no matter how many operations you chain, the functor version is about 150ns behind native). there's a traversal step that I think i could eliminate by "compiling" the operation, as well as a few other spots for optimization. it's pretty close to zero cost. there's a single heap allocation for a generator that yields the inner type (the A in F<A>) into the operation. the allocation is being made so that i can return a generator from a function, so i might be able to fix this by creating or consuming the generator elsewhere. but i'm not sure about that.

the interface suffers quite a bit but it still accomplishes my goals. the enum interface is considerably better but i'm pretty sure you're not going to do better without modifying the compiler:

code:
impl<'d> Functor<'d, VecKind> for VecKind {
    /// If you use your imagination, you can pretend that this translates to:
    /// (F<A>, Fn(A) -> B) -> F<B>
    /// While it's pretty ugly, the type equation above is enforced.
    /// There's also some room for improvement here.
    ///
    /// In this encoding, "FA" represents our concrete HKT, Vec<A>.
    ///
    /// The return type is the ugliest bit: basically, the only way to build a deferred chain
    /// of polymorphic operations on the stack is by building a nested structure like so:
    /// Map {
    ///   op: closure@src...,
    ///   inner: Map {
    ///       op: closure@src...,
    ///       inner: Value(Some(1))
    ///
    /// The outermost map executes it's closure with the value of the output of it's inner Map, which
    /// executes it's closure with the output of _it's_ inner Map, and so forth. This is how futures and interators work.
    ///
    /// So anyhow, we basically have to pass our function and our FA into the output of our functor,
    /// so I'm basically just pretending this is boilerplate that you can ignore. However it's still
    /// an important and complicated part of the public api so it's really not ideal. OH well.
    fn map<F, A, B, FA>(fa: FA, f: F) -> functor<'d, VecKind, B, F, FA>
    where
        F: Fn(FA::Item) -> B,
        FA: Lifted<'d, Kind = VecKind, Item= A>,
    {
        functor {
            inner: fa,
            f: f,
            __marker_k: VecKind,
            __marker_b: PhantomData,
        }
    }
}
but uh, there's a problem:

code:
        let h = Vec::<i32>::eval()
            .map(|i| i * 2)
            .map(|i| i * 2)
            .map(|i| i * 2)
            .map(|i| i * 2)
            .map(|i| i * 2)
            .map(|i| i * 2)
            .map(|i| i * 2)
            .map(|i| i * 2)
            .map(|i| format!{"{:?}", i});
> time cargo test
I gave up after 10 minutes, so it appears that compile time increases exponentially with the number of operations chained. naive guess is that it's related to generators, since they're unstable, otherwise i have no idea.


why am i doing this?

DONT THREAD ON ME fucked around with this message at 04:35 on Jul 19, 2018

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
oh yeah coroutines motherfuckers!!

code:
    fn request_yield<D2>(
        &'d self,
        input: <Self as Lifted<'d>>::HeadInput,
        outer: D2,
    ) -> Box<Generator<Yield = <D2 as Yield<'d>>::ChainOutput, Return = ()> + 'd>
    where D2: 'd + Yield<'d, Input = Self::Item>
    {
        Box::new(move || {
            for i in input.into_iter() {
                yield outer.run(i)
            }
            return ();
        })
    }

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder

JawnV6 posted:

hi, i still know absolutely nothing about "kinds" despite several generous attempts, but i DO know benchmarking

are you doing any source inspection? i'll admit i reach for that super early, but you'd want to make sure that the 'native' version isn't getting artificially boosted by the compiler (like that rjmccall post about the swift perf 'regression') . make sure it's actually doing the work, with such a short list it'd be tempted to just solve it at compilation time, you want to see it 'actually' loading values from a list-lookin' thingy and processing them
by source inspection I assume you mean inspecting the outputted assembly? yeah I would very much like to and I've tried but I need a little bit more time with assembly before I can make sense of it. working on that!

anyhow as you say: vec for sure has at least unsafe optimizations that i could probably implement. but i wouldn't be surprised if there's compiler boosting. so i'm optimistic about where i'll be able to get performance.

but yeah, uh, testing a bigger list, that makes sense. same benchmark as before but with 10,000 entries in the list:
code:
test sandbox::lazy8::tests::bench_vec_map_from_functor    ... bench:   2,231,253 ns/iter (+/- 40,062)
test sandbox::lazy8::tests::bench_vec_map_native          ... bench:   2,138,998 ns/iter (+/- 39,938)


quote:

is 'eval' up there a language feature kicking into an interpreter or a hook of your implementation?
eval is part of my implementation, it's just creating the head of the evaluation chain, which is later interpreted. I've been thinking of it as an interpreter anyhow.

quote:


hm, sounds like the compiler's fault

yeah, i think so.

tinaun posted:

male shoegaze you should write a blog chronicling your HKT rust adventures, there's fp nerds on the lang team who would probably love to read about it

i decided that i was going to blog about it early on so i've actually been taking notes and stuff. thanks for the prodding, the hard part now is not giving up when i decide that it's all stupid.

e: my benchmark currently maps the `Vec<i32>` to a `Vec<String>`, if i skip the string formatting step and just multiply the int a couple of times, the native implementation does much, much, much better.

code:
test sandbox::lazy8::tests::bench_vec_map_from_functor_no_string_alloc    ... bench:      69,607 ns/iter (+/- 7,078)
test sandbox::lazy8::tests::bench_vec_map_native_no_string_alloc          ... bench:       7,118 ns/iter (+/- 546)
Feels like some compiler hjinks to me, but it's not really surprising that iterators would be optimized around the simple computation i'm giving it.

DONT THREAD ON ME fucked around with this message at 13:31 on Jul 19, 2018

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
JawnV6 (or anyone else): recommendations on where to get started learning assembly? it's about time.

don't say reading luigi's posts

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder

Lutha Mahtin posted:

you could look into a textbook or one of those open online classes for an undergrad level "computer organization" course. this is the class where you learn assembly and how the processor, uh, processes it

after you learn assembly you can learn how to write a compiler :getin:
ya ive written a few interpreters, so ive been looking forward to writing a compiler for a while

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
goddamn i'm so excited to have a year to study this stuff in earnest rather than cramming at night or on weekends when i'm already tired.

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder

VikingofRock posted:

Hey male shoegaze if you're getting exponential compilation times you should file an issue on the rust GitHub. They take solving that sort of thing pretty seriously so I'm sure they would be very interested in hearing about your case.

yeah i plan to. i only hit the issue last night and i need to isolate a test case first because my poo poo is pretty crazy right now.

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
lol there’s a loop in our message bus wreaking havoc. i warned that this would happen if we continued to rely on kinesis as our only method of ipc for our 30+ micro services, but service to service calls are still forbidden because they create coupling

DONT THREAD ON ME fucked around with this message at 17:47 on Jul 20, 2018

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
I honestly don't know much about how academia functions, I mostly threw the PhD thing out because if I'm going to go get an undergraduate degree at 32, I want to make sure that I'm getting the most out of it. If a masters is sufficient to unlock the jobs I'm interested in, that's fine.

But really, I think that I'll probably be able to get myself on the right path with a year of dedicated study, making open source contributions in the areas I'm interested in, and being willing to accept positions that pay less than I'm making now.

What it comes down to is: When I started my career, I chose web because it was the most accessible path for a very inexperienced programmer with no college degree. Since then, I've been operating under the assumption that webdev is just the best I'm gonna be able to do (as a terrible programmer with no college degree). But honestly, I'm a great programmer who works very hard and there's no reason for me to limit myself to webdev when I desperately want to do something else.

I shortsell myself ITT as a defensive mechanism because it's easier for me to pretend to not care than it is to care and be wrong. But honestly, I love this poo poo, I am serious about programming, and I don't want to spend my career figuring out how to shoehorn functionality into CRUD apps with developers who just want to clock out at the end of the day and never think about programming again (not that there's anything at all wrong with that, but it's not me).

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
i do realize that im setting myself up for a big disappointment when i realize that everyone is doing garbage programming. but there must be fields that are better than webdev

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder

CPColin posted:

lol

edit: lol

don’t laugh at my soul

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder

CPColin posted:

sorry lol

apology accepted

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
when i got here all of these services were running on the same host, but all communication was still done over kinesis, this is better than a monolith because

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
it's not fair to make fun of the one host thing because that was really just an early phase startup decision. nobody wanted to keep things that way.

but here's something we can make fun of:

all of our domain models are defined in a single project. this project gets included in all of the services. the shared models are used when synchronizing data between services: when one service gets an update, it updates it's document in mongo and then dumps the document into the pipeline. the consumers then read the data out of kinesis and write it back out (sometimes altered, sometimes not) to their own mongo database.

quick sidebar: the size of these models is, in some places, exceeding the 1mb kinesis message limit. compressed json.

this approach is really bad for lots of reasons that i don't want to enumerate. but what really bothers me is that this is so obviously a problem of our services being inherently coupled: 90% of our services share 90% of the same data, and this is because 90% of our services should just be in one big monolithic app. they separated them because microservices scale well, the same reason they chose mongo as the datastore for relational medical data, and the same reason our microservices are now on kubernetes. (all of this despite the fact that even if we're wildly successful, we will never have more than maybe 100k concurrent users).

so rather than do the smart thing and start to consolidate services where possible, we're just decoupling even more: the model project I mentioned has been killed off. which sounds like a good thing, right? no: now each service has its own version of the project, with unneeded models pruned out. we just copy and pasted everything. this has already caused multiple production problems.

the reason we're doing this is to decouple. i'm not just injecting that: it's literally the reason we did it.

i really love the people i work with for the most part but i am so glad i'm leaving. i tried really hard to fix this dumpster fire and that was very stupid of me.

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder

jit bull transpile posted:

I didn't realize you're in Healthcare it now. I'm no longer surprised. Every piece of health care software bar none is a piece of poo poo cargo culting bad programming paradigms badly 10 years after their heyday.

yeah i'm getting out. really not my thing at all.

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
lol @ having a database schema , what a peasant


for real this place has soured me on ever wanting to deal with data in a serious way. i am way the gently caress over data forever.

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
honestly i don't want to touch a database ever again. mongo is so bad.

i'm sure i'll have to use a sql database again and i'm sure it will be better than mongo but if anyone ever tries to make me use nosql for anything that is not a great use case for nosql i am going to say no, sql. sql only.

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
yeah tools development is appealing to me. ideally i'd be working on something where the end user is other programmers. libraries, frameworks, tools, etc. because, you know, i want to work on things i'm interested in, and i'm interested in programming.

but i think these jobs are pretty competitive.

DONT THREAD ON ME fucked around with this message at 05:17 on Jul 21, 2018

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder

Finster Dexter posted:

I didn't know your full situation... but it's actually somewhat similar to my own path about 10 years ago. From your posts you seem overqualified to be just webdev, imho. If you are in the U.S. I don't see why you need to accept less pay to get out of webdev. You really shouldn't have to, unless you're doing p-lang webdev (php or js), but even then, you could spend a few weeks to a month going through a book on C# and apply to a .NET SSE position if you have at least 3+ years of experience. The horrible awfulness of webdev will prepare you for the horrible awfulness of enterprise software dev or whatever. And if you are js or whatever, just get a SSE position that works with node (lmao).

IMHO if you want to go the academia route, don't get a CS degree. Get something like math or physics and then you can basically write your own check as a data science guy since you've already got the programming chops. You just need some rigorous stats classes, and honestly you might be able to get by with just a few stats classes, but IANADS (i am not a data scientist).

I dunno, I'm not even sure you're looking for advice but I went from being a php dev (of 5 years exp.) to a .NET backend lead basically overnight because I spent time outside work getting to know C# and .NET. It was a pay-raise, but I was also horribly underpaid as a webdev (which I think most are?) I would also say don't get discouraged (not that you are) because there are so many options out there for programmers even terrible programmer like me are managing to get those figgies without degrees. I think terrible programming is the one of the most friendly careers for non-degree chaps.

appreciate it and thanks for the advice. this job was actually my jump from "full stack ruby developer" to "full backend scala developer" and i'm very happy about that move. i've definitely escaped plang hell (scala is its own hell, but i love it).

if i do go back to school, math will definitely be involved, but i dont know how much. math was my focus when i tried school the first time, and it didn't work out, but that's a totally different post.


Fiedler posted:

great, you've figured out that you want to write developer tools. now immediately go apply for those jobs. worst case is you're not hired and you try again in 6 months.

yeah i'm definitely doing this once i'm done working. even if i have no intention of taking the jobs i need to know what the field looks like and i don't currently.

tef posted:

like microservices don't make things scalable, nor do monoliths, like monolithic means 'we invested in our feature dev cycle' and microservices means 'we invested in our platform tooling', or maybe monolith means 'we are tired of cross repo synchronization and deployment' and microservices is 'we are tired of long build times and want to work in isolation'

the "invested in our feature dev cycle" bit is really true and why the micros thing hurts so much here. we are very, very focused on feature dev with all that comes with it. there's nothing wrong with that, but trying to iterate on features really fast in a microservices architecture is really really hard.


also a big thanks to everyone who has put up with all of these lovely posts. double thanks to those of you who have troubled to give advice. i really appreciate it.

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
it’s the nesting that kills me. like yeah no joins sucks but it doesn’t add that much cognitive overhead if you just accept the poo poo performance. it’s the nesting that kills me. change a document? hope you remembered to update that document everywhere it’s been nested! good luck!

no transactions is balls though

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
yeah i dont know that mongo is any worse than other document stores; mongo is the only one i've used seriously.

my issue is more with relational data being backed by a document store, that's the problem. it's an absolute nightmare to maintain.

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
tef's posts always remind me that i need to learn more about distributed systems.

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
[quote="

eschaton posted:

Rust hacking suggestion: take your functor thingy and profile the compiler and see if you can figure out why the slow part is slow, and what to do to fix it

eschaton" post="486351738"]
also spend your time after this job writing tools

hacking on Rust itself would be a good start

so would hacking on Swift, or writing new static analyses for clang, or helping with the SBCL POWER9/ppc64le port, that sort of thing
[/quote]

yeah working on understanding the rust compiler issue as we speak. it's taking me a while to isolate a good test case but i'm 100% sure it's related to generators. but i probably wont make a ton of progress until i'm done with this job.

i would love to work on swift stuff too so i'll see what's going on! thanks for the recs!

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder

or that.

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
jsoup looks ok???

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder

prisoner of waffles posted:

tef/thread, is FoundationDB legit? It sounds pretty good as a CP system, with the "sane default" of no transactions >5 seconds long

ya im curious too, it makes a lot of promises that sound like bs but i don’t know enough to know

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder

jit bull transpile posted:

Can someone explain what is meant by "composability"? It's a term that is used itt all the time but I've never encountered it elsewhere.


to contrast with inheritance, in the "car extends vehicle" example instead of defining a complicated "Vehicle" interface that makes a lot of assumptions about what a vehicle is, you'd define smaller modules like "HasWheels", "ContainsPassenger", "KillsPedestrians" etc. Then you can have "Car extends HasWheels with ContainsPassenger" or "DriverlessCar extends HasWheels with KillsPedestrians".

DONT THREAD ON ME fucked around with this message at 21:59 on Jul 23, 2018

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
composability good, class inheritance bad willing to die on this hill

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder

Captain Foo posted:

negation is not composable with square roots unless you include the complex library

wish your posts weren’t composable

Adbot
ADBOT LOVES YOU

DONT THREAD ON ME
Oct 1, 2002

by Nyc_Tattoo
Floss Finder
ok what’s the best blogging option in 2018? this is about shameless self promotion and not a burning passion to share my ideas with the world so im willing to pay i guess. ideally there’d be analytics i guess. not sure about comments: id guess that comments generate more traffic but it gives people an opportunity to point out how stupid i am right there in the blog, as opposed to offsite.

also people with blogs: do you think it’s helped your career much?

  • 1
  • 2
  • 3
  • 4
  • 5
  • Post
  • Reply