248 karma · joined October 5, 2008
I haven't heard of any others, but I'd be curious to know about them.
I didn't realize how enjoyable it would be until I was a team lead in the early 2000's and I started doing code reviews and established peer reviews in my team. The team would review the code with someone else in the team, and when they couldn't find any issues they'd pass it to me for final review and deployment. The process was sort of gamified (without realizing it, I later found out their goal was to get it by me without me flagging anything).
Since that experience I've been freelancing, I usually try to establish the same environment in the teams I work with. I sometimes do pure mentoring, where I'm not working on the day to day aspects of the project, and am just reviewing pull requests and offering suggestion; but this isn't quite as common yet.
Lately I've been getting more gigs to act as a mentor, and that's pretty cool, but I don't think it's something I would want to do full time. I've found the mix of working with the team and mentoring feels perfect to me.
I opened up the case and there's not a scratch on it. Aside from some dust the phone is still in mint condition. The case is nearly perfect too aside from one tiny bent plastic part under the rubber shell.
I won't say which case it is because I don't want to sound like an advertisement, but IMHO it's totally worth it to get a good one.
I've been working on a relational algebra library for ruby (tentatively) called veritas [2] where the sets are closed under all operations.
Given that it's a higher level abstraction than ARel the trade off is that there's not a 1:1 mapping between it's pure RA ops and SQL operations. I err on the side of producing SQL that will returns the correct results, which means some of the queries are a bit verbose. I consider that only a temporary problem though; I believe I can get to the point where most common queries are identical to what you'd write by hand. I'm focused on correctness before performance.
I've also written an optimizer [3] that takes the RA AST and rewrites it to be smaller and more efficient. It handles lots of the low hanging fruit, but there's still room for improvement. The advantage to this approach is that it simplifies the AST for all targets, not just SQL. There's even room to do per-target optimizations, which is nice because there is often multiple ways to form a query, and some approaches may be more efficient than others on different backends.
[1] https://github.com/sconover/knit-js#footnotes [2] https://github.com/dkubb/veritas [3] https://github.com/dkubb/veritas-optimizer
The people running the coop are responsible for finding us the new contracts, and they add something on top while I get to charge decent rates. I know I could probably market myself and earn the same thing without the middleman, but I don't have to worry about keeping the pipeline full, billing, negotiations, etc.. having someone else handle that frees me up to focus on development.
The nice thing about this arrangement is that since we're a team we can work on larger projects than I would otherwise be able to bid on myself. Instead of having to juggle 5 or 10 projects to fill all my billable hours in a month, I can easily do it with just a couple. I'm also able to go much deeper and work on 6-12 month contracts, rather than doing short, trivial projects.
At first TDD becomes a way to assert your code does what you expect. After a few years you begin to use it as a design technique, and the correctness argument becomes less and less of a reason for using it. It's more of an (albeit nice) side effect at that point. I can write code that I test after the fact and still get the same correctness benefits, but the feedback I get from testing my design is gone.
Maybe I'm missing something, but I don't know if just having an excellent type checker is enough to provide the same quality feedback loop as well executed TDD does.
The last 8 years I've worked almost exclusively for US based businesses as a remote contractor. It's the best of both worlds, I can charge competitive rates but have a relatively overall lower cost of living and access to free healthcare. Taxes are higher in Canada, but it works out that I'm way ahead than if I lived in SF or NY.
The downside is that I occasionally do miss the one-on-one interaction I get with team. It helps that I've begin working for a co-op, and I'm often working as a team with the same devs on new client projects. I also do lots of oss work, which helps me keep my skills up by working on challenging projects as part of a community.
In oss, I think you can make contributions in two ways: refine or invent. To do either of these you have to learn the past.
Even if all the only result is an exact clone of BeOS an entire group of developers will have learned a whole lot about something state-of-the-art at the time it was created. That's knowledge that was previously available only to a tiny group of people.
I wonder if it's the same thing with Facebook and other social networks. By "socializing" on FB the brain gets the same kind of high as if you had actually spoken to the person, thus making you feel satisfied with the social interaction so you don't seek them out.
I can't recall the names of any dev shops for the OSX products I have purchased, much less the ones I use for free.
I have no problem with people selling simple tools that make built-in features more accessible.
I could've used this many times to catch cases where the amount of work being performed didn't match my expectations; usually an indication of an incorrect assumption or mistake I had made. Instead I sat there waiting for something way longer than I should've, only because I had a bad feedback loop.
In a nutshell, how sourcify works is it gets the source_location for the Proc, which gives you the file name and line number. It uses Ripper to parse the file, and the Proc starting at that line number. It provides an object that can be fed into SexpProcessor to extract information about the block of code within the Proc.
Since it's bound to Proc#source_location one of the limitations is it can't distinguish between two or more Proc objects defined on one line (eg users.select { |u| u.id == 1 }.select{ |u| u.name == 'John Doe' }). However, that doesn't seem to be too much of a limitation.
However, with sourcify you can sort of emulate the 1.8 behaviour, but it's not perfect. It uses ripper to parse the file where the Proc is defined, and then provides the same callbacks that ParseTree does. It mostly seems to work, but it does run into problems if two Procs are defined on the same line, eg: users.select { ... }.select { ... }.
I'm actually a little disappointed that ruby-core decided to go in this direction. I think that decision will end up costing the community because it makes it harder for runtime introspection of code. It means less tools will be written on top of the runtime, and things like Ambition become harder if not impossible to do reliably. I'm glad to see Rubinius is going in the opposite direction though.
It uses sourcify (which uses ParseTree on 1.8 and Ripper on 1.9). The semantics are identical to standard Enumerable API. In fact, it's not recommended, but you can turn off dm-ambition and the expressions will still work as-is -- only instead of generating a query from the block it iterates over the results and filter in-memory.
Maybe the gp doesn't know about it or chooses not to use it, but it exists.
So by the time I'm in a position to influence those processes I can't remember what the problems were.
What I started doing was take notes the first few days/weeks of what is required to get setup, or where things could be improved. Then I refer back to them every few weeks, and will sometimes up up with solutions and start sending them up the chain.
It doesn't use a GA, but it's still pretty neat. It parses the code into an AST and then mutates each node in the AST, rerunning the tests to see if they pass or fail. They are supposed to fail; if they continue to pass, it means a state isn't being tested.
The computer acts as my assistant tracking down cases I forgot to test, so that I can write the test to catch the mutation. Sometimes it even finds sections of code that are impossible to reach normally, allowing me to remove the dead code paths that I might otherwise have missed.
I should note that I'm not disagreeing with you, I just think there are more important considerations to make before physical location of the data.