bit全探索
例題: ある整数の集合が与えられたとき、その部分集合の中である値X以上となるものの中で最小の総和を求める問題。
例えば、集合が {1, 2, 5, 10} で、X = 10 だとすると、部分集合 {10} や {5, 5} や {2, 2, 5} などが考えられ、その中で総和が最小となる部分集合は {10} で、総和は 10 となります。
#include <iostream> #include <vector> #include <climits> using namespace std; int main() { // 要素の数 int n = 4; // 要素 vector<int> a = {1, 2, 5, 10}; // 目標となる値 int X = 10; // 最小の総和を表す変数(最初は最大値に設定) int min_sum = INT_MAX; // ビット全探索:0から2^nまでループ for (int bit = 0; bit < (1<<n); ++bit) { int sum = 0; for (int i = 0; i < n; ++i) { // i番目の要素を選ぶかどうか if (bit & (1<<i)) { // i番目のフラグが立っているならば sum += a[i]; // 総和に加算 } } // 総和がX以上かつ最小ならば更新 if (sum >= X) { min_sum = min(min_sum, sum); } } // 最小の総和を出力 cout << "Minimum sum >= " << X << " : " << min_sum << endl; return 0; }
新卒エンジニア 1年を振り返る。
早いもので、新卒でエンジニアになってから1年が経ちました。
記録として、一年でどのようなことを感じたのかを書いておきます。 (個人の感想ですので、温かい目で見てください🥺)
配属した当時
自分の配属されたサービスは、非常にユーザー規模の大きいサービスでした。
最初に、セットアップしたい際に非常に複雑なディレクトリ構造とファイル数でほんとに訳が分からなかったことを覚えています。
ほかにも、ドメイン知識、アーキテクチャの理解やgitのルール、複数のツールなど非常に情報にあふれており非常に混乱しました。
できたこと・学びになったこと
・技術的な面での成長
設計内容から実装を行うことや、git, githubの細かい機能の使用方法など始めた当初と比べると多少できるようになったかなと思います。
・運用
日々、運用のエラーやバグが発見されたりなど運用の対応を行いました。
もちろん、全てのエラーを見るわけではないですが各担当ドメインについて確認します。
既に、原因が確認されているエラー対応への効率化や実際にユーザーのログを見て対応が必要なのかどうかを判断するなど非常に学びになりました。
・技術的負債
サービスを開発・運用していると技術的負債はつきものですが、実際に大きくアーキテクチャを変えたりリファクタリングする経験はありませんでした。
実際、サービスローンチ初期に作成されたものなどは仕様書がなく、実装者も退職しているケースも珍しくありません。
コードベースで解読して、パターンや構造などを洗い出しながらリファクタリングしていかなくてはなりません。
新規開発以上に設計や計画などを行ってから実装する必要があると学びました。
できなかったこと・学びきれていないこと
・ドメイン知識、ビジネス的な観点
実際、まだ自分が詳細まで知っているドメインが少ないのが現実です。
また、契約などビジネス的な観点がまだまだキャッチアップできないないなど個人的な課題はまだまだあります。
プロダクトがどの方向へ進んでいくのかなどを知ることでより開発するときなどに生きる気がしています。
・詳細な技術的な理解
抽象的なアーキテクチャの理解や構成は少しずつ理解できてきてはいます。
ただ、実装時にどのような点に気を付ける必要があるのかなどはまだまだ課題が残っていると感じています。
・インプット方法
実装、調査などこれまで経験のないドメインなどに触れる機会があります。
デバッグや確認をしているとついつい時間がかかってしまっているのが現実です。
最低限の、要点を決める、どのくらいの緊急度なのかなど基本的なところをしっかり定義して実行する必要があるなと感じています。ここは、社会人としては当たり前のことかもしれませんがつい焦ってしまうのでテンプレのようなものを用意して対応しようと思っています。
上記で、自分個人的な振り返りを行いました。
下記では、大規模なサービスの開発環境について振り返りを行います。
メリット
・優秀な人が多い。
日々、優秀な人が多いなと感じることが多いです。
技術的な負債や、設計、レビューなどの意思決定やインシデント時の対応など非常にすごいなと感じることが多いです。自分も意思決定への観点などが甘い部分も多いので、なるほどなあ~と思ってみていることが多いというのが正直なところです。
少しでも学びになるよう、キャッチアップを行っています。
・上長やチームがサポートしてくれる。
私のチームには、非常に経験のあるチームの方が多いです。
聞くと大体教えてくれますし、相談も乗ってくれるので非常にありがたいです。
実際、エンジニア経験が10年以上ある方が多いので自分の力不足を感じることが多いですが日々直庭させていただいています。
デメリット
・新規開発が少ない。
技術的な負債を解消に工数を使っているのもありますが新規機能開発を行うことが少ないです。
実際、作ってしまうと運用コストが上がってしまうので安易に作ることができません。
もちろん、規模が小さいサービスも検討はすると思いますが規模が大きくなると実装を進める前の調査やコストなどの点で開発までのハードルは大きくなります。
・設計や意思決定をする箇所が少ない。
もちろん、自分の経験が少ない、スキル面も乏しいのもありますが基本的にウォーターフォールの形になるため、メンバーは設計をもとに詳細設計、実装を行うことがほとんどです。
設計にチャレンジすることは、少ないため経験として積みずらいなと感じています。
・影響範囲が大きい。 実際に、バグや設計ミスなどが後で見つかることがありますが既存部分に大きな手を加えると影響範囲が大きくなりテストや実装に大幅な工数がかかってしまいます。 設計時に、工数がある程度決められているため根本的なリファクタリングを行うというよりは工数を最小限に抑えれる実装になってしまいます。
これから
配属から一年たちましたが、エンジニアとしてまだまだ力不足を感じます。 より成果を出せるように頑張っていきたいと思っています。 個人的には、もう少しこのまま大きい規模のサービスに触れその後、PMF前後のサービスで開発したいと思っているので配属の異動や転職なども考えていきたいです。
SQLコマンドについて
ついつい、忘れてしまうのでここにSQLについてまとる。
SQLの種類について
SQLのコマンドは、大きく分けて DDL, DML, DCL, TCL の4種類に分けられる。
DDL : Data Definition Language
- CREATE, ALTER, DROP, TRUNCATE
DML : Data Manipulation Language
- SELECT, INSERT, UPDATE, DELETE
DCL : Data Control Language
- GRANT, REVOKE,
TCL : Transaction Control Language
- BEGIN, ROLLBACK, COMMIT. SET TRANSACTION, SAVEPOINT
最近使用しているgitにいて
最近、使用しているgitコマンドについて書いていきます。
まず、git addについて
- add
$ git add -p
git addに-pをオプションでつけるとaddする内容が分割して見ることができます。
y
コマンドで選択された箇所がaddされ
n
コマンドで選択された箇所がとばされ次にいきます
ほかにも、e
やq
などあります。
さらに、s
を押すとさらに分割され選択することができます。
次に、
- status
よく変更されたファイルを確認する際に、
git status
を使用しますが
git status --cached
をしようすると実際にどのコードがaddされているのかを確認することができます。
最後に、
- git log
git log
主に、commit ログを見る際に使用します。
開発する中で、このコード過去に変更履歴があるか知りたい時
git log -L 行数,行数: ./ファイルパス
で見ることができます。
ちなみにこの機能は、githubの右上blamボタンからでも見ることができます。
以上、git についてのまとめでした。 参考になればと思います。