始めに
こんにちは、まんじです!
今回はPythonの実務レベルを解説だょということで書いておきたいと思います。
結論から書くとここらへんがPythonで実務レベルって言ってもいいのでは?ぐらいのレベル感な気がします。
- Pythonに限らずプログラミングで必要な基本的な概念を理解して使える(基礎文法)
- Pythonの関数型の処理などの少しニッチだけど便利な文法が使える
- Pythonで単体テストが書ける
- Pyhtonで実務するにあたって必要な関連知識を抑えてる
- APIサイドならフレームワークとデータベースレイヤーとデータの流れを理解している
- AWS側のLambda jobなどを書くならAWS周辺
- スクレイピングなどのデータ処理を担当するならAPIやSQLやSeleniumなど
- AI系の場合はデータ処理と機械学習に関する部分
基本的には実務で担当する役割に対して必要な実装ができるかってのが実務レベルです。
例えば、APIサイドならフレームワーク、データベース(マイグレーションやSQLなど)、APIたてる、APIテストする、フロントエンドとの連携を把握できる、などなどです。
正直、実務レベルって言っても会社とやる仕事やポジション次第で同じ言語のPythonを使っていたとしてもレベルは結構変わるので一概には言えないところではあります。
が、、、大体こんな感じなのでは?という部分もあるので、今回はそこらへんを解説します。
Pythonに限らずプログラミングで必要な基本的な概念を理解して使える
Pythonを書くと言っても、他の言語と同様に基本的なプログラミング言語の共通概念を理解して問題なく使える必要があります。
- 変数
- 定数
- 配列
- 連想配列
- メソッド(関数)
- 文字列操作
- オブジェクト指向
- デコレータ
- 型の概念
- if文
- forループ
- whileループ
- 正規表現
- 例外処理
上記のような項目がプログラミングの基本的な概念というかざっくりとした基礎文法です。
Pythonでも他の言語同様にこれらが必要です。
他の言語、例えばJavaScriptと比べるとPromiseとかは最初から登場しない(一応Pythonにもasyncはあるけど)ので、他の言語に比べると基本的な文法は実務レベルだとしても抑えやすいかなと思います。
JavaとかCとかGoとかのがオブジェクト指向とかポインタが登場してくるので、最初の文法から少し難しいというか感覚的に理解しにくいものも多いです。
一方で、Pythonの基本的な文法に関してはドットインストールあたりの入門講座を1~2周軽くやればなんとなくは把握できます。
https://dotinstall.com/lessons/basic_python_grammar
なんとなく把握ができたら、次は実際にフレームワーク使ってウェブアプリ作ったり何かしらを作っていくことで、文法の理解度がより上がっていくようなイメージです。
とりあえずまずは基礎文法を抑えられているのがPythonの実務レベルでは必須です。
Pythonの関数型の処理などの少しニッチだけど便利な文法が使える
関数型の処理はJavaScrioptなんかではごく普通に使われるんですが、Pythonでも使われます。
- リスト内包表記(これは関数型の処理かは不明…)
- map
- filter
- reduce
- lambda
基本的にこれらの処理はforループとかで実装できるのでいらないっちゃいらないんですが、実務でこれらの文法を使う人もチラホラいるので、チーム開発するにあたって必要になります。
プログラミング入門したての頃はmapにlambda(無名関数)とかを使う意味が分からないんですけど、慣れてくるとごくごく自然に使う意味とか意識せずに、なんか使うようになります。
ちなみに関数型の処理を使う理由はスコープの範囲を小さくしてバグを起こしにくくする的な意味合いなどがあります。
リスト内包表記に関しては処理速度が早いとか、便利とか、いろいろ言われています。
関数型の処理はリスト内包表記以外はPythonだとそこまで積極的には使われないので、関数型の処理を身に付けたい場合にはJavaScript(TypeScript)あたりでなんか作ったりしていくとPythonの関数型処理も同じように書けるようになります。
ということで2つめは関数型の処理を抑えようってことでした。
Pythonで単体テストが書ける
インテグレーションテストも含めなんですけど、実務だとバックエンド側のほうがテストがしっかり書かれるケースが多いです。
Pythonでコードを書いたら、それをテストしてあげる必要があります。
手動で実行して「動きます!!!」ってのもそうですし、pytestなどのユニットテストライブラリを使っていろんなケースで想定通り動くかをちゃんと試すというよりかは、動くことを保証するために書くという感じです。
自分1人でコードを書いてると特にテストを書く必要性に迫られないんですけど、チーム開発だと必要になる確率が高めです。(そういうルールだからってのもあるし、バグが少なくなるからって理由もある。)
実務に入る前に、テストの概念を多少抑えておくと実務でつらすぎて無理すぎる…みたいなことは減るかなと思います。
境界値テストや、異常値テストや、正常値テストなどなど呼び方はいろいろありますけど、そういったテストケースをなんとな〜く知って書ける必要があります。
入門レベルだとシンプルに関数のテストだけなんですけど、実務になってくるとMockとかSpyとかが出てきて関数のコールした回数やら引数やら一連の処理をテストすることになります。
MockとかSpyとかは最初は少し難しく感じがちなので、実務入る前ぐらいのレベル感だとpytestあたりでPythonのユニットテストを適当に雰囲気でちょいちょい書いてあげられるぐらいならいいのかなーと感じます。
※ ユニットテスト覚えたての頃とかは関数に対して全部書こうと思っちゃうけど、やってると時間かかりすぎるので勉強段階では、ある程度でOK
MockとかSpyとかはChatGPTとかのAIに聞いたり解説してもらったりググりながら1つ1つ理解していくと良いと思います。
あとユニットテストのコードは最近はChatGPTとかに書いてもらってチェックしたりするぐらいでもいけるケースが多いので、AIに書いてもらってチェックするだけでも大丈夫です。
Pyhtonで実務するにあたって必要な関連知識を抑えてる
Pythonで実務をするときはPython単体で書くことはほぼなくて、基本的に何かしらの目的のための手段として使われます。
なので、必ず関連知識というよりも目的の何かのためにそれをPythonで書いてあげる、みたくなります。
例えば、データ処理系のエンジニアでやるなら、Pythonからデータベースを処理するためにPythonのORMなどを使うのでORMの知識とデータベースのクエリ言語(素のSQL)を理解して使える必要がある、みたいな感じです。
ジャンルごとに軽めに解説してみます。
APIサイドなら、フレームワークとデータベースレイヤーとデータの流れを理解している
APIサイドでウェブエンジニア(ソフトウェアエンジニア)としてPythonでバックエンド開発をする場合は、基本的には以下の知識が必ず最低でも必要です。厳密にはもっといろいろミドルウェアとかも入ってくるので必要。
- フレームワークの知識(Djangoが使われてるならDjango)
- データベースレイヤーの知識(SQLやデータベース)
- データの流れ(フロントからサーバーからデータベースまでどうデータが行き来してるのか)
上に書いた3つは、未経験からエンジニア始めるぐらいの最低限の部分で、実際はもっといろいろ入ってきます。
Redisのキャッシュとか、AWSのS3とかlambdaとかと統合したり、外部サービスと連携するためのAPIの仕様をドキュメント読んで把握したり、こういった関連する多くの開発知識が必要になります。
ただそこらへんに関して言うと、実際に実務しながら調整とキャッチアップをしていくしか道がほぼないです。
実務前に全部抑えちゃおうぜ系はほぼ無理(時間かかりすぎだし1人だと無理)なので、最低限のところだけやっておいて、実務で必死こいてキャッチアップしてレベルを上げていくような感じにやる必要があります。
Pythonベースでそこらへんの周辺知識をまるっと抑えられるぐらいになると時給単価で4000円ぐらいのエンジニア、さらにアーキテクチャとか含めてできるようになると単価で時給単価で5000円以上ぐらいになるかなーってのが個人的な感想です。
AWS側のLambda jobなどを書くならAWS周辺
バックエンドエンジニアだと基本的にはAWSらへんのクラウドの知識がある程度必要です。
EC2, S3, lambda, RDS, SQS, SNS, EKS, …etc
特にlambda jobらへんとかは結構使われてる印象なので、AWSの知識?経験?勉強?が必要になるケースも多いです。
フロントエンド担当の人よりもバックエンド担当の人のほうがクラウドは当然使えるよね感があります。
AWS以外だとGCPかFirebaseあたりが定番ですが、AWSが1番使われてます。
AWS関わってくると大体EKSとかのクラスタあたりも理解してサービスの全体像とかも把握してる人が多いように思えます。(自分はフロントエンドメインなのでよくわからん)
スクレイピングなどのデータ処理を担当するならAPIやSQLやSeleniumなど
Pythonで実務をする場合、データエンジニアというポジションなんかもあります。
具体的にやることはスクレイピングしてSQLでつっこむとか、SQLでデータを整えるとかで、データサイドを担当する場合にはスクレイピング関連の知識とSQLが必要です。
スクレイピングに関してはSeleniumとか使ったり外部のAPIを呼ぶって部分が必要です。
SQLに関してはORMを使った場合から素のSQLを書くケースまであるので、SQLのやや深めな知識が必要になります。
データエンジニアの人からORMじゃなくて素のSQLが書けるかみたいな部分を技術面接でやってるおって少し前に飯食ってるときに教えてもらいました。
AI系の場合はデータ処理と機械学習に関する部分
データ処理は上のデータエンジニアとほぼ同じなんですけど、それに加えて機械学習の知識も追加で必要になります。
ある程度簡単なアルゴリズムを把握してただライブラリにつっこんでモデル作って簡単に使うケースから、もっと低レイヤーなところだとかなり学術的な内容になるので自分はそこは受ける企業によってレベルがマチマチだと思います。
学術レベルの論文が必要なところもあれば、すでにできたアルゴリズムを問題なく使ってデータモデル作ってデータつっこんでからアウトプットできればOKなどなど。
(自分は専門ではないのであまり分からない)
AI系の場合はアプリケーションレイヤーのAPI側とかの知識はいらないんですけど、機械学習系やデータ処理の知識(Pythonではない)が必要と言う感じで、それをPythonでただ書いてあげるってイメージ。
まとめ
実務で担当するであろう領域の部分を意識してPythonを勉強すると良いかもしれません。
厳密にはPythonを勉強するというよりも、Pythonの文法を使った実装範囲の知識をカバーしていくようなイメージで、Python単体を実務で使うことはほぼありません。
(JavaScriptやって仕事したいとかと一緒で、JavaScriptという言語を使ってReactとかで何かしらの実装をしたり、、、って実際はなります。)
そんでもって基本的に実務入る前に実務レベルをカバーするのは無理なので、ある程度の最低限のところだけ抑えて、実務に入ってから必死こいてキャッチアップするほうが効率は良いです。
自分で勉強して「PythonのORMでSQLが使えるぜ!」みたく思っていても、実際実務だともっと複雑な要件のもとでテーブルをjoinしまくってその条件にサブクエリ書いて〜みたいな複雑なものも出てきたりします。
あとは書き方もこっちのがパフォーマンスが良いとか共通化するとかシビアなことも要求されるので、実務入り立ての頃は結構苦労します。
なので、ある程度最低限の勉強をしたらレッツ・実務をしてボコボコにされながら成長していく必要があるので、自分が仕事でやりたい部分の最低限の部分だけ勉強してさっさと仕事に応募するのがおすすめです。