Toxic seems like a strong word to describe standard relational database functionality. Are you seriously recommending that join functionality always be done in the application layer? If so, are you speaking from specific experience, and can you elaborate on your reasoning?
I've seen too many poor re-implementations of relational database functionality in the application layer to ever recommend it as a standard starting point. Doesn't the concept of not prematurely optimizing apply here? Solve the scalability problem when you need to. That may mean moving some join functionality into the application layer, but the solution to any given scalability problem depends on the specifics of the problem. Just throwing out database joins as a rule seems drastic.
I've been the beneficiary of vacation payouts somewhat regularly, which were in addition to bonuses paid based on overtime hours. I was also able to take advantage of a significant chunk of vacation I had built up when I left my previous company to help fund starting a new company.
In my case, I would probably not benefit dollar for dollar from an unlimited vacation policy. I would either take less vacation or not benefit from the payouts. That's not to say that unlimited vacation is a bad policy. It might be a great policy, and I'm sure it depends on the details of how it is implemented and the culture of the company where it is implemented; however, it is certainly possible that the practical outcome is more of a net benefit for the company rather than the employees.
Since many startups these days are advertising unlimited vacation, I'd love to hear from both founders and employees about some of the practical ways in which this policy plays out.
I stopped worrying much about so-called bad code a long time ago. Reading eye-watering, mind-numbing code is practically a pre-requisite for working on any non-trivial enterprise system at a business of any reasonable size. In many ways, you come to enjoy the challenge of it. I've had to read code written in an almost obfuscated manner in languages I'd never previously worked with before. You get used to it. You learn to read and grok just about anything.
On the topic of massive Perl scripts, I once worked on implementing a system that was an unholy maze of Perl, Pro-C, Pro-COBOL, Oracle Forms, Java, and PL/SQL. It was the first time I'd ever had to read and write Perl and Pro-C. I even remember reading Pro-COBOL at one point to debug a problem. Good times.
Since the above is somewhat tongue-in-cheek, I'll clarify that I certainly think we should strive to write excellent code and constructively help each other to that end. We should probably be very slow to dispense judgement but quick to share carefully considered, contextually relevant advice. You really do need to understand the context under which something was written to make any useful statements about goodness or badness (which is still probably not that helpful a measure). Something that looks bad at first may be fantastic work considering the circumstances under which it was written.
Thinking about code in terms of "good" and "bad" is not very useful. Don't worry about what developers on the internet think about the quality of your code unless they offer specific suggestions in a constructive and instructive manner. If someone offers specific and thoughtful suggestions or criticism, learn everything you can from them.
The quality of content on my Facebook feed has taken a turn for the worse lately. I regularly see sponsored or related posts that I have absolutely no interest in, leaving me with a more negative impression of that business and of the value of the Facebook experience. I don't mind ads, but they should at least be relevant. If you are putting ads directly in my feed that are as far from relevant to me as possible, then you've got a problem.
It all started when I saw a post about purchasing country-style boots from a discount country store. Then it got worse with posts promoting Walmart. I believe those posts suffered from the problem noted in this article. It looked somewhat like a friend promoting Walmart.
Does anyone know if there is a way to hide this stuff?
The article seemed to be referring to dramatic moments of self-assessment when people fundamentally transformed themselves or their businesses. In a startup, I would think that you typically do this many times before finding the winning formula. Does anyone have insight into how often it is practical and useful to do a dramatic re-imagining of the fundamentals of your business? I'm guessing there is such a thing as pivoting too much or too often.
Certainly, I think it is important to practice self-awareness and self-assessment on a daily basis, but there are no shortage of good ideas on a strong startup team. Every few days someone has a great new idea that could be transformative, and from my experience, you try to question yourselves and your assumptions all the time (hopefully in as brutally honest a way as is necessary, though you sometimes wonder if you are fooling yourselves). Perhaps reality is simply more incremental, though it can look dramatic and transformative after the fact. Every sprint planning meeting and every board meeting is an opportunity for rigorous assessment. You just have to work hard to maintain self-awareness, to see things from a truly unique perspective and make big changes when necessary. Outside advisers certainly help. Otherwise, we are human after all, and it is easy to fool ourselves.
I've made language choices on quite a few projects. To be honest, I've never specifically evaluated static vs. dynamic typing as one of the major factors in the decision, and I've never seen static vs. dynamic typing become a major point of debate. The discussion typically revolves around pragmatic issues related to existing standards, compatibility with existing software, skills of the team, availability of programmers, etc...
Do you really think the use of dynamically typed languages is an important enough factor to require justification? I don't want to imply that the distinction isn't significant. I'm sure it is. I just haven't had any experiences where it came into play when making a language choice, and I'm curious whether you can elaborate on the need for justification.
> Do you really think the use of dynamically typed languages is an important enough factor to require justification?
Yes, because when you pick a dynamically typed language, you are giving up on important advantages that become crucial as your code base grows, among which:
- Type annotations, which make it easier for newcomers to understand the existing code base (and obviously, catching early errors by the compiler).
- Automatic refactorings, which guarantee that your technical debt remains at a reasonable level since it's so easy to evolve your code base as it grows. Even the simplest refactorings require human supervision in dynamically typed languages (here is a good explanation why: http://goo.gl/SKaos )
Those are consequences of not having static types; they are not consequences of having dynamic types. I have to stick up for ObjC, which has dynamic types, but enjoys the advantages you listed because it also has static types.
Out of curiosity, why do you specialize in developing MVPs for people with ideas, and how did you get into that type of work as a primary focus? Do you find that the work is more interesting than doing consulting jobs for more established businesses? Assuming you've found plenty of projects that meet your rules, do you have opportunities to become a co-founder, and have you considered them seriously?
I've done consulting, startups, and free work on side projects. At this point, if I find people and projects that meet my requirements, I'd probably prefer to become a co-founder and make a real go of it. I don't think I've ever taken a small amount of equity as compensation for substantial unpaid development work. Under those circumstances, equity is not tasty. I'd rather do well-paid consulting work or find a great team and go all in.
I actually also fix MVPs when they start breaking :)
Honestly, I just find working with startups and small companies in general to be more interesting, even though there is usually slightly less money involved. I got into this type of work by hanging around Hacker News and writing blogposts aimed at a hackerpreneur auidence.
It's amazing how many great projects you can attract if your writing is half decent and you have a good idea once in a blue moon.
As for jumping full in, yeah I'd love to eventually, but I've learned to be cautious and cover my bases first. Maybe when I have money saved up so I don't have to earn anything for months on end. Being young has its disadvantages.
I'm curious as to why the conversation about compensation for work done for "non-technical" upstarts is almost always framed as a binary "payment in equity vs cash" issue. Seems like there would be a huge market for MVP development by developers with a hybrid compensation model. (Maybe this is already common?)
For instance, a developer could quote Price X to non-technical co-founders to develop a simple, proof-of-concept MVP with an agreement to would receive Equity Y upon completion if the developer either (1) stays on for Period P or (2) helps the founders successfully land a more suitable, long-term developer to take over the project. The parties could even agree that Equity Y would be larger (e.g. 2Y) if the developer stays on.
Benefits to the non-technical co-founders would be (a) a proof-of-concept (or failure), (b) alignment of incentives with a developer to try hard, and (c) access to an insider to help find a permanent developer upon completion of the MVP if the MVP developer wants to exit (e.g. for a better opportunity).
The benefit to the developer would be (i) guaranteed fees, (ii) potential for equity (even if he exists) and (iii) flexibility.
More, a subsequent developer would have the chance to deal with someone who speaks his own language in the negotiation with the non-technical cofounders, and could avoid and annoying and/or exhausting translation of technical details.
An obvious objection may just be that non-technical co-founders never have money to pay for an MVP. I am far from an expert, but I would think that some do.
What you're describing is called vesting and is hopefully used by anybody doling out equity of their company.
The options for a developer in today's marketplace are such:
1. Technical founders who can offer equity only
2. Technical founders who can offer equity and money
3. Technical founders who can offer money only.
4. Non-technical founders who can offer equity only.
5. Non-technical founders who can offer equity and money.
6. Non-technical founders who can offer money only.
In either type of founder, the best option for a developer is equity+money, if they can afford a full-time commitment.
If the founder can only offer equity, this raises the stakes significantly and is a problem. Especially if the founder has overlapping skills with the developer. But the overlap of skills also breeds a certain camaraderie that is not to be ignored.
If the founder can only offer money, that makes it a clean [probably ongoing] contracting job with the flexibility to work on separate projects and whatnot.
The real problem with equity+money is that you are roped in full-time and tied down for an extended period of time. The reason I personally got into freelancing instead of having a normal job is that it gives me the freedom to change projects frequently - every couple of months. I advance quicker as a developer, grow my network quicker and my life is more interesting.
Knowing that I will spend the next 2 years working on a specific project is a very big commitment indeed and I want to be damn sure it's something I am extremely passionate about. (hint: this is usually reserved for my own ideas)
Perhaps it's just a sign of the times that I am happy taking on clients with no more than a few months' commitment and be certain that my bandwidth will always be filled to the brim for the foreseeable future anyway. In fact I am strongly thinking about expanding myself into a small team just to keep up with demand.
PS: there's also likely a bunch of legal and tax hassle in having my consulting company or myself be part owner of a bunch of other companies.
Online marketplace for high quality woodworking plans and software on iPad, iPhone, Mac, and Windows for exploring woodworking plans in 3D: rotate, zoom, isolate, explode, etc... We released the IdeaRoom software very recently, so we have a lot more we plan on adding like resizing the project and customizing wood textures.
I've seen too many poor re-implementations of relational database functionality in the application layer to ever recommend it as a standard starting point. Doesn't the concept of not prematurely optimizing apply here? Solve the scalability problem when you need to. That may mean moving some join functionality into the application layer, but the solution to any given scalability problem depends on the specifics of the problem. Just throwing out database joins as a rule seems drastic.