I usually think of the ideas behind "composition" as "how do I assist a future developer to replace the current (exported) implementation of a type with a new one by restricting external visibility of its internal implementation through the use of private methods and data".
In "inheritance", it often feels like the programmer's mindset is static, along the lines of "here is a deep relationship that I discovered between 2 seemingly unrelated types", which ends up being frozen in time. For example, a later developer might want to make a subtle innovation to the base type; it can be quite frightening to see how this flows though the "derived" types without any explicit indiction.
Of course, YMMV, but I think of "composition" as "support change" and "inheritance" as "we found the 'correct way to think about this' and changes can be quite difficult".
Since I think that the key to building large systems handling complex requirements is 'how do we support disciplined change in the future' (empowering intellectual contributions by later generations of developers rather than just drudge maintenance).
Legacy corporations have a very hard time incorporating fundamental technology shifts (moving from ICE engine/drivetrain dominant designs to software dominance).
They walk into the future looking backward, unable to identify/vet the team skills needed going forward, leading to silly hacks like: 1) hire from "big s/w companies", 2) pay high salaries to poorly vetted people, 3) adopt all the new fashionable buzzwords like "software defined vehicle", 4) force new teams every inch of the way to justify design choices to mediocre legacy management.
The only formula I know that works is "hire good people and listen to them".
From experience, the only way legacy companies can do this is acquire and/or seriously partner with companies that have established a track record in what you need (even if it is only a couple of years, as long as they are _delivering product_).
As software effectiveness/innovation speed/productivity continue to increasingly crush legacy industries, it is extraordinarily frustrating to see how hard it is to make (seemingly simple!) changes.
Instead of looking at your high quality software as an "asset to monetize", I would recommend thinking of it as a "way to introduce your high quality skills to attract high quality customers that are more than willing to pay for your time".
This allows you to get money for customizing the software for specific applications, but still build up a valuable asset over time (instead of just being a T&M slave).
I spent ~11 years in Japan, porting/building telecom protocol software and, more importantly, trying to build software development and business competence in our teams. Sadly, although I had a reasonable impact on individual software engineers technical ability, I was unable to find any path to leverage that into "software business building" expertise.
Of course, the attribution of causes to this is highly subjective and I expect every person to come away from the elephant with a different interpretation.
In my case, the very, very top down 'age hierarchy' culture was (and continues unabated) to crush any ideas and proposals that come up from younger and more competent engineers. In the last 30 years with Japan, I have met only a small handful of people that are willing to take input, let alone change direction, from someone younger than them. (a trivial example was a fellow company director of mine that was born 5 _days_ earlier than me. In 4 years working together, not once would he take anything I said seriously. Hmm...)
Give the number of excellent Japanese software engineers that I know, the burden of this "culture" is (to me) quite tragic on its impact slowing down national progress in an important global field. If anyone as ideas how to get around this, I would love to know and learn.
I guess the solution would be to build a different company from the ground up and then shield against the common culture sneaking in. You would need to repeat it very often though. Or have a branch office of a non-japanese company.
I live in a small country and there are foreign companies and while they have to adjust to local laws and have mostly local employees, they still are culturally different from each other.
I wonder how GE with a strong central process and culture control is doing in Japan?
It is not only in software that Japan has currently difficulties. It is in any domain that requires to "move fast and break thing".
Japan is excellent at incremental improvement (Kaizen) but absolutely terrible at managing disruptions.
And the reasons are exactly the ones you point out: Excessively hierarchical management practices means that mid-management will kill any evolution that is seen as a risk to them.
When I first met him in 1978 and asked for his last name, he replied "Arvind is my name". He was very deeply against the caste system and felt that using last names (IIRC, which also indicated caste) was something that he refused to do from high school (his high school diploma name is just 'Arvind'). It seemed that this was a hassle his whole life, but one he continued because he felt so strongly.
He said that after 9/11, the US government came down very hard on MIT to force use of last names and that is the first time I ever knew what it was.
Deeply thoughtful, highly caring and warm to all the people he met, he will be deeply missed!
Having had interactions with board members at 2 Fortune500 companies I worked for, I have pretty much lost faith in the "board members reflect the shareholders and manage the executive team" model.
In one case, the board member said that the only material about the company they were ever given was carefully constructed/managed by the CEO/executive team and was not detailed enough to support any critical analysis of executive team decisions.
In all cases, the board members seemed to feel that they were there merely for "helpful advice" rather than "proactive intervention" and the only decision that was clearly in their domain was "replace the CEO", which is pretty grand step.
The directors I have known were all quite competent, sincere people, but knew that their continued presence on the board was predicated on being just a sounding board for the CEO and/or Chairman.
In addition, I was told that, in the US, conflict of interest and other legal liability for directors is now so intricate and severe, that it was no longer possible to hire directors that were competent in the field and not yet fully retired (so hiring directors in the 45-65 age range is impossible, a bit of a problem for high tech!)
For those among us who think that steep liability for directors is a good thing, I have a question: would you take that job, when you are just paid a fixed, modest sum for board appearances (perhaps $50-100k/year, total)?
In any case, I don't know how to get "responsibility" and "authority" tightly connected at the top of any modern company. (The only exception I know of is when the company is still run by the founders)
I personally have not looked into this very much, but the difficulty of recruiting active, competent members for the board of directors was mentioned often by 2 directors I knew.
edit: Thinking more about this, I think that the difficulty recruiting directors with related competence came from a fear of Sarbanes-Oxley laws and “imputed” conflict of interest complaints for the prospective director. In practice, SOX could be really difficult.
Strongly agree. When you feel like the combination of administrative hassle and/or work content no longer fits you, it is trivial to just wrap up the current work cleanly (as mentioned above) and just move onto another, more appealing project.
The nice side effect of being a contractor is that your CV now looks like you have been in the same position for 10 years instead of a series of 2 year stints.
I have done this and always worked hard to help the team succeed. Later, when I decided to try working for a couple of large companies, I was stunned to be treated as "you work in my organization and will follow my every whim".
One example is attending endless pointless meetings waiting for the client to decide what spec they want, just because the manager wants to everyone on the team to be present (and silent).
As a contractor, it becomes quite easy to say "it looks like I am not adding much to your project until the project spec gets settled. Please let me know when you are ready to implement (or have more detailed questions that you need to know to flesh out the spec) and I will be happy to help anytime".
In my experience, it is quite common that they will have hashed out the requirements and be ready to start work after 12 months or so and were happy to talk then.
> The nice side effect of being a contractor is that your CV now looks like you have been in the same position for 10 years instead of a series of 2 year stints.
Can't you do this with W2 work too? "Oh, that was all private consulting work. No sorry, I'm not able to tell you who I was consulting."
that's effectively what i did, but i listed all stints as if they were jobs, and my CV is rather lengthy as a result. some of them were contracts, some where were actual employment. we used whatever form was more convenient. sometimes employment was necessary for visa purposes. in the end i don't think it matters. consulting is consulting, and i may very well share who i was consulting for, it's still different from having a long term job. as a hiring manager i would still ask: "you have been consulting for the last 10 years, why are you looking for employment now?"
the transition from independent consulting to long term employment is just as questionable as the one from job-hopping to long term employment. you'd have to be working as an employee for the same consulting company for multiple years to give the impression that you are willing to stick with the same employer for a longer period.
> the transition from independent consulting to long term employment is just as questionable as the one from job-hopping to long term employment
This is very easy to explain. Contracting is inherently a less stable way to make a living, and many contractors return to normal employment when they decide that they want the extra stability back. Perhaps they just want to reduce the stress, or maybe their home-life changed for some reason…
oh right, that's a good point. getting older, having a family and wanting to settle down is a good explanation for wanting a stable job after years of work on short term projects.
I mean, homeless people freeze to death if they stay in places like MA - is it really hard to think that CA with a far more temperate climate would see more homeless people?
> religion of rituals that aim to gain some measure of control over a chaotic world
Yes, my experience is that most Japanese are into "actions/practice" more than philosophical "big ideas".
Ise Jingu is my favorite place anywhere; it is a place to stop thinking, become humble before nature and appreciate things as they are.
In "inheritance", it often feels like the programmer's mindset is static, along the lines of "here is a deep relationship that I discovered between 2 seemingly unrelated types", which ends up being frozen in time. For example, a later developer might want to make a subtle innovation to the base type; it can be quite frightening to see how this flows though the "derived" types without any explicit indiction.
Of course, YMMV, but I think of "composition" as "support change" and "inheritance" as "we found the 'correct way to think about this' and changes can be quite difficult".
Since I think that the key to building large systems handling complex requirements is 'how do we support disciplined change in the future' (empowering intellectual contributions by later generations of developers rather than just drudge maintenance).