web-dev-qa-db-ja.com

コードベースで迅速に配信し、成長の課題を回避する方法は?

起動コンテキスト

私の友人が最近私に、まだコードを書いていないスタートアップのパートタイムソフトウェアエンジニアになるように頼みました。彼女はかなり深刻で、すでにかなりのお金を集めています。しかし、現在彼女は開発のためにフルタイムで誰かを必要としません。

それが報告されている限り、彼らは明示的に二次雇用を承認するので、私の現在の雇用主には法的な問題はありません。

ソロ開発者として速くスタート

私が見ているように、単一の開発者の考慮事項は、たとえば5のチームの考慮事項とは大幅に異なります。

  • ユニットテストは、すべてのコード行が私のものであるため、それほど重要ではなく、デバッグが容易になります。 100%のテストカバレッジでは、収益が減少します。ただし、後で完了する必要がある場合があります。
  • コミットを行うのは私だけなので、マージに関する考慮事項はありません。
  • Jenkinsは、単体テストを実行している限り、ソロ開発者としてはそれほど役に立たないようです。
  • あなたはチームなので、プロジェクト管理は実際には重要ではありません。

しかし、これらすべてが後で問題になる可能性もあります。

質問

成長のために効果的に移行するコードベースを構築しながら、高速移動のバランスをとるにはどうすればよいですか?

できれば、開発チームを率いてリードしたいのですが、バスにひかれたとしても、役に立たないものに悩まされたくないです。

基本的に、彼女が明日100万ドルを調達し、私が4人の後輩を雇って製品を急ぐのを手伝うように言われた場合、私がコードを書くとき、シームレスに移行するために開発者として何をすべきですか?

確かに幅広い質問ですが、Stack OverflowとRedditには、技術的負債の話や、技術チームの不自由な新興企業の成長にうまく対応できていない話がたくさんあります。それを避けるにはどうすればよいですか?

2
BossJustQuit

目標設定

あなたがハーフマンチームであるか、200マンチームであるかに関係なく、あなたはあなたの目標が何であるかについて明確にする必要があります。つまり、プロジェクト管理が必要です。

これで、200ページのWord文書を署名、グラフ、さらに読むためのリンクでドラフトする必要がなくなりました。 実際にはそれを行わないでください。

ただし、以下について明確にする必要があります。

  • 解決策はどこですか
  • ソリューションを評価する理由
  • ソリューションの責任者
  • その解決策にどのように移動したいか
  • 解決策に到達したいとき
  • ソリューションに到達するのに役立つツール
  • そのソリューションへのどのパスを使用していますか

これらは簡単に答えられる質問ではありません。しかし、あなたはそれらに答える必要があり、答えは時間とともに変化します。

ソリューションがどこにあるのかを知ることは、既成か、一緒に丸めるか、社内ソリューションかを評価するのに役立ちます。 SQL Serverライセンスの料金を支払いますか、MySQLを使用しますか、または専用の永続化ライブラリを作成しますか?ソリューションが高可用性カテゴリにある場合、SQL ServerまたはMySQLを使用する方が理にかなっています。あなたがもっと利用可能な何かを書くことができるかどうかは疑わしいです。組み込みスペースにいる場合は、必要なものを正確に調整できるため、自分の役割を果たしてもかまいません。解決策がどこにあるかわからなければ、ロケット車にゴーカートホイールを取り付けたり、鉛バルーンを作成したりするのは間違いです。

解決策は、その存在理由と同じくらい優れているだけです。それは巧妙に作られ、インストールする夢かもしれませんが、そのユーティリティが年に1回、10秒のタスクに取って代わる場合、それはあまり価値がありません。ソリューションが必要な理由を知ることは、何か有益なことに集中するのに役立ちます。知らなければ、偶然にしか役に立たない。

責任。あなたがいつ働くかは誰が決めるのですか?あなたはどれくらい働きますか?いつ働くの?昼休み中にサポートを要請できますか?誰がお金を使うことについて電話をかけますか?誰が開発プロセスを決定するのですか?意見の相違が発生した場合、誰が仲裁を行いますか?今、彼女はあなたの友達ですが、あなたが仕事について話し合っているとき、彼女は誰で、あなたは誰ですか?責任が明確であることを確認してください。あなたは彼女を導きたくないが、あなたが信頼できるものを彼女に知らせたいのです。また、あなたが誰になることが期待されるかについても明確にしてください。マネージャーとしての行動は快適ですか?ソフトウェア開発とは異なるスキルセットです。

これにどのように取り組みますか? TDD、BDD、その他の設計プロセスに従っていますか?どのように並行作業を許可しますか? (自分でたぶん、フォーカスを変更するように求められる可能性があります。まだ運用準備の整っていないブランチをどのように処理していますか?)バグ、機能、タスクをどのように追跡していますか?どのようにして達成された作業を実証していますか?運用システムをどのように維持していますか?悪い展開をどのように処理しますか?どのように答えるかは、どのようにすれば迅速でダーティーなコードを書くことができるのかということを理解する必要があります。優れたクリーンなコードを評価する場合、これは確実に不満を感じる方法であり、コードを嫌うことになります。自分自身をトラブルから救い、自分が大切にしていることに専念してください。

奇妙ですが、企業は何かが達成される時期を知りたいと思っています。そのため、ビジネス価値と呼ばれるものを得るために達成する必要がある他のすべてのタイミングでスケジュールを立てることができます。トレーニング、広告、ブース、デモンストレーションが必要な場合もあります。ですから、これの一部は、準備が整ったときに前に出て、ビジネスを最新の状態に保つことです。したがって、これらの大きなマイルストーンはいつ起こりそうですか。見積もりを作成し、定期的に更新します。少し遊んで、どのシステムがあなたの見積もりを最も正確にするのに役立つかを考えてください。

実際に作成し、ソフトウェアを操作するために必要なすべてのこと。それらはたくさんあります。これらには、使用するコードエディターから、ドメインネームサービス、プリンター、guiライブラリー、それらすべての「無料」パッケージなど、すべてが含まれます。具体的に何が変更されるのかを知る必要があります。おおまかに何であるか、またはそれらが現在何であるかを学ぶ方法。あなたが知らなければ、新しい開発者のための準備をするのは難しいでしょう。ああ、あなたはこの資格が必要です、そのランタイム、ああ、もちろんxyzをインストールすることを忘れないでください。また、本番システムとテストシステム、自動テスト、ソース/コードのバージョン管理、プロジェクト管理などの作成と保守も難しくなります。これらのツールをできる限り多くのコードとして扱うことで、個人的には厳しく統治しています。そして、そのコードから定期的にさまざまなサーバーを再構築することで、自分を正直に保ちます。残りのメンバーは、年に2回の定期的なレビューの予定があるドキュメントに住んでいます。

最後に、今あなたはどちらに向かっていますか。これは、以前のすべての回答に触発された短期的な目標です。それはあなたの現在の活動に関するかなり技術的な答えです。ベンダーを比較する場合、これはベンダーをこれらの基準と比較することになります。バグハンティングをしているのであれば、バグの原因を特定し、少なくとも3つのソリューションを生成し、基準に照らして評価し、修正をスケジュールすることが考えられます。または多分それはこれらの機能などを実装します...

高速移動

父がよく言っていた古い言い方:速くではなく、速く動く

誰でも速く動くことができ、走るだけです-あなたはおそらく壁にぶつかるか、崖から逃げるでしょう、そして、いくつの方向があるかを考えると、あなたは走るでしょう間違った方向ですが、男の子はあなたの足を動かしています!

しかし、すばやく移動するということは、状況を理解し、いくつかのパスを特定し、パスの品質を比較し、状況に応じて最適なソリューションを選択することを意味します。後で戻る必要があるかもしれませんが、それは、自分で愚かに仕事をしていたからではありません。それは、環境が予測できない方法で変化したため、とにかくやらなければならない仕事だったからです。

プロフェッショナリズム

エンジニアの意識の流れから直接組み立てられた車を購入しますか?

さらに重要なのは、意識の流れから直接組み立てられた車を喜んで販売することですか?

以前に製造されたすべての車の回路図にアクセスできるサイボーグ拡張があったとしても、私は個人的にはそうしませんでした。少なくとも私はそれらの10個を組み立て、それらを最初にテストして、それらの回路図が正しいことを自分で証明しました。さまざまなテスト用にさまざまなサブアセンブリも組み立てます。そして、その車の操作方法やメンテナンス方法を明確に伝えることができなければ、決して売れないでしょう。

基本的に、愚かではありません。これらのテスト、そのドキュメント、回路図ドキュメントは目的のためにあります。それらはあなたが強調した問題に対処するために正確に作成されています:

  • 高レベルの回路図は、学習曲線を不可能/困難から困難/管理可能なものに減らすので、迅速な成長を可能にします。
  • テストは、予期しない変更に不注意を警告する安全ハーネスを提供します
  • ドキュメンテーションは、他の人が賢明な決定を行うことを可能にする厳選された知識を提供します

そして最も重要なことは、後のソフトウェア開発者が継承し、住む文化の基礎を形成するこれらの活動についてのあなた自身の考え方です。どのコードベースがあなたの遺産になるでしょうか?

将来の開発者は、適切で設計されたコードを継承し、サポートおよび最新の概要、健全で読みやすいテスト、設計の選択とその理由を記録したドキュメントを継承しますか?

または、理解できない大量のコードを取得するのでしょうか?

ツーリング

Jenkinsは、他のツールと同様に、目的を果たす場合にのみ役立ちます。

私も一人のチームです。スケジューラが必要なため、Jenkinsを使用しています。それ:

  • sSL証明書を更新し、
  • 毎日の検証ビルドを実行して、古いパッケージとセキュリティ問題を特定し、
  • 私のサーバーが2分で実行できるときにDockerが最新のイメージをダウンロードするのに10分間待つのが面倒なので、公式ビルドを実行し、かなりの単体テストグラフを提供します。

スクリプトを実行して、これらすべてを手動で実行することはできません。

分岐

あなたは分岐し、おそらくマージするでしょう。

次のものがあります。

  • 緊急事態が発生し、
  • より多くのベイク時間を必要とする大きな機能
  • 機能は完了しましたが、機能が停止しているために遅らせる必要があるか、ビジネスの承認が必要です。
  • 物事を刻み続けるためにこれらのすべてのブランチにプッシュする必要がある開発スクリプトの変更...

言うまでもなく、あなた自身が言ったように、他の4人の開発者を雇う準備ができている必要があります。彼らが物事を混乱させる前に、どのように分岐するのかを知る必要があります。

6
Kain0_0

あなたが表明する課題は次のとおりです。

単独でさらに高速に
-アフリカのことわざ

まず第一に、あなたはtestingをより大きなチームのための贅沢品として見ないでしょう。ソフトウェアと一緒にいくつかの単体テストを書くことはあなたを助けます:

  • 後でバグを見つける時間を失うのを避けるため。
  • より多くのテストを行い、リソースが少ないにもかかわらず、より高い品質を提供する
  • aPIとコード構造の設計を改善するために:サードパーティの観点から、より早く、より多くの批判をもって考えるでしょう。

次に、gitも贅沢とは見なさないでください。

  • 誰も何かを変え始めたことはなく、1時間後にこの混乱を始めたことを後悔しているのですか? gitはあなたの時間を節約します!
  • もちろん、シンプルなワンマンワークフローから始めます。自分のコードをピアレビューしないでください;-)

最後に、技術部門は致命的ではありません:refactoringはあなたの友達です:

  • 設計について少し考える必要がありますが、時間のプレッシャーがあるため、迅速に開始する必要があります。そして、ひとまず始めてインスピレーションを得たら、開発に夢中になります。
  • 不完全なデザインから始めることを受け入れます。しかし、ソロのように、あなたは非常に機敏で、自分自身に簡単に同意します。フローをすばやくリファクタリングして、初期の設計上の欠陥を取り除くことができます。 (アーティストは多くの場合、ソロで作業し、結果に満足するまでカットして変更することで傑作を提供します。)
  • 後で、チームと一緒に、あなたは集合的な体験の機会を得て、同じ考えを単独でカバーするよりも短い時間で一緒に考えます。

    最後に、テトリスのルールです。

あなたは迅速に決定し、悪い決定を受け入れる必要があります。しかし、混乱が積み重なってゲームが終了する前に、すぐに混乱を掃除する必要があります。

3
Christophe

直接フィードバック

コードベースで迅速に配信し、成長の課題を回避する方法は?

これらは一般的に互いに対立しています。短納期は、隅を切り、技術的負債が発生することを意味し、コードベースが新しい要件に適応する必要がある場合、成長の課題につながります。

答えは2つの間のバランスであり、状況に応じたものです。

たとえば、私は悪名高いスコープクリーパーである顧客のために働いており、成長の課題を回避することに大きな重点を置いています。ただし、納品後のさらなる開発がないことが明らかなプロジェクト(例:一時的な解決策)も行ったため、必要に応じてコーナーがカットされました。

ユニットテストは、すべてのコード行が私のものであるため、それほど重要ではなく、デバッグが容易になります。

今日と6か月前のあなたは、あなたとボブが今日異なる開発者であるのと同じくらい、2つの異なる開発者です。

デバッグが十分に速く、コードをテストする必要がないことを効果的に主張しています。これにより、テストのポイントが大幅に失われ、多くの場合、デバッグの必要性がまったくなくなります(テストが明確なアサーションで記述されている場合) )。

ユニットテストを書くように強制することはできません。デバッグに満足している場合は、問題ありません。しかし、これが良い習慣であることには同意しません。

そうは言っても、これは状況に応じたものです。特定の短期的な使用例のために小さなコンソールアプリケーションをハッキングしても、単体テストは行いません。永続化して長期的に適応させるコードベースを開発する場合は、単体テストを作成します。

コミットを行うのは私だけなので、マージに関する考慮事項はありません。

それはあなたが中断することなく各変更に取り掛かることを前提としています。変更を実装している途中で(すでに何かをコミットしている場合)、顧客からの情報を待っていることに気付いた場合はどうなりますか?フィードバックを受け取るまで待つか、すべてのコミットを取り消す予定ですか?
または、変更を実装している最中に本番バグ修正を展開する必要がある場合はどうなりますか?変更が完了するまで、プロダクションのバグ修正を保留しますか?

アサーションは、(何らかの理由で)タスクを完了せず、代わりに別のタスクで作業する可能性を排除します。タスクの切り替えを許可する場合、プロジェクトで作業している人の数に関係なく、本質的に、競合をマージするために自分自身を開放することになります。

Jenkinsは、単体テストを実行している限り、ソロ開発者としてはそれほど役に立たないようです。

あなたが物事を忘れたり、間違いを犯したりするより上にいると考えるのは傲慢です。確かに、テストを実行する必要があることを知っているかもしれませんが、Jenkinsがそれを実行することを覚えておく必要があるよりも、Jenkinsがそれを強制することをお勧めします。希望すべてのデプロイ。

あなたはチームなので、プロジェクト管理は実際には重要ではありません。

プロジェクト管理はチームのためだけに存在するのではありません。それは、それが上層部の管理者であろうと顧客であろうと、利害関係者に報告を戻すためにも存在します。あなたが一人のチームであるからといって、外部の人々があなたの進捗状況を追跡することに興味がないわけではありません。

基本的に、もし彼女が明日100万ドルを調達し、私が4人のジュニアを雇って製品を急いでもらうように言われた場合

ブルックの法則 "後期のソフトウェアプロジェクトに人員を追加すると、後で"

4人のジュニアを雇うと、これらの開発者をトレーニングするために1日のうちに時間を費やす必要があるため、生産性が低下します。特にジュニアの場合、彼らが開発を始めても、最初は遅くなり、ミスを犯したり、計画に後退や後退を引き起こしたりする傾向があります。

成長のために効果的に移行するコードベースを構築しながら、高速移動のバランスをとるにはどうすればよいですか?

[..]技術的な負債の話、またはスタートアップを壊滅させる技術チームの成長に順応しない。それを避けるにはどうすればよいですか?

速く動かないことによって。つまり、コードの品質を犠牲にして期限を最小限に抑えようとしないことです。

一般的に言えば、遅くても着実にレースに勝つ、少なくともマラソンでは(つまり、ソフトウェアの長期的な使用と適応)


要約する

あなたのソロ開発者の主張はすべて私にとって赤信号です。その理由を詳しく説明する前に、私はソロ開発者としてのキャリアをスタートさせ、あなたがこれまでに主張したことはありますが、私も過去に行ったことがあります。私はあなたとは違う意見を持っているので、私があなたの考えを却下するとは思わないでください。

あなたの考えは間違っていませんが、あなたはそれを十分に考え、現実/実用性を説明していません。デバッグは速いかもしれませんが、デバッグする必要がないのはさらに速いです。些細なことだと思うテストの作成はスキップすることもできますが、将来このテストされていないロジックを忘れてしまった場合は、きっと気に入るでしょう。あなたが唯一の開発者である場合は分岐をスキップするかもしれませんが、変更の実装の最中に優先順位が変更されると問題が発生します。
長期的なプロジェクトの場合、近視眼的ミスによるこれらすべての時間マージンが増加し始めます。

もう少し明確で、現在の問題と密接に結びついていない例を使用してみましょう。

アプリケーションでデータベースのFK制約に対してエラーが発生しない場合、なぜテーブルにFK制約を設定する必要があるのでしょうか。

表面レベルでは、これは正しいようです。無効なFK値を挿入しない場合、FK制約は関係ありません。データが無効にならないことが保証できる場合は、データを検証する必要はありません。

ただし、家が燃えない限り火災保険は必要ない、事故に遭わない限りシートベルトを着用する必要はないということと同じです。技術的には正しいが、確実に未来を予測できない点が完全に欠落している

ソロ開発者のアサーションはすべて、上記のFKの例に類似しています。 「完璧にやればミスはしない」というのはトートロジーであり、何かがうまくいかないと、結果が深刻になるという点が絶対に欠けている時間をかけて適切な予防策を講じていました。

彼らが間違いを犯す可能性があると考えるには傲慢すぎるロックスター開発者になるという罠に陥らないでください。あなたがジュニアかシニアかに関わらず、間違いは起こります。自分が犯す可能性のある将来の間違いを説明するという考えに対応できない場合は、間違った作業をしています。

2
Flater

ソース管理、単体テスト、ビルドサーバー。これらのものはあなたをスピードアップするように設計されています。あなたを遅くしないでください。

最初にフレームワークの設定を取得して、バックロードではなく高速道路で開発するようにします

  1. スタックを選択してそれを使い続ける
  2. ソース管理。
  3. デプロイ先のサーバー
  4. CIパイプラインのセットアップを取得する
  5. テスト
  6. 安全保障
  7. 開発開発開発。青い空があなたの前にあります。

迅速な開発への道を切り開いただけでなく、新しいスタッフを引き受け、追加のリソースから即座に利益を得ることができるようになりました。

批判的に、あなたはあなたの将来の仕事からサポートタスクを削除しています。デプロイが失敗した理由の解明、または確かに機能するために使用されている機能のデバッグなど。これらは、開発フレームワークが削除または最小化する膨大な時間のシンクです。

0
Ewan