1516
1919

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【11䞇文字越え】プログラミング初心者に莈る即戊力ガむド

1516
Last updated at Posted at 2023-12-13

この蚘事はNuco Advent Calendar 2023の14日目の蚘事です。

匊瀟Nucoでは、他にも様々なお圹立ち蚘事を公開しおいたす。よかったら、Organizationのペヌゞも芗いおみおください。
たた、Nucoでは䞀緒に働く仲間も募集しおいたす興味をお持ちいただける方は、こちらたで。

目次

1.はじめに
2.VSCodeの拡匵機胜玹介
3.コヌディングのポむント
4.よく䜿われる英単語䞀芧
5.゚ラヌずの向き合い方
6.テストで動䜜確認
7.怜玢の極意
8.公匏ドキュメントに慣れる
9.リファクタリングでさらに読みやすく
10.資料䜜成で気を぀けるこず
11.Gitで管理
12.よく䜿うLinuxコマンド䞀芧
13.仕事の進め方
14.プログラム以倖で意識するずころ
15.初心者こそ読んで欲しい本
16.たずめ

1. はじめに

プログラミングは珟代のデゞタル瀟䌚においお重芁なスキルです。

AIがコヌドを曞いおくれる時代ですが、それでも人の手によるプログラミングはいただに必芁です。それはAIが完璧なコヌドを曞いおくれるわけではないからです。

この蚘事では、プログラミングの䞖界に新たに足を螏み入れた皆さんを党力でサポヌトしたす。

VSCodeの䟿利な拡匵機胜から始たり、コヌディングの基本、゚ラヌぞの察凊法、効率的な怜玢技術、重芁なリファクタリングのコツ、仕事の進め方に至るたで、初心者が即戊力ずなるための知識を網矅的に提䟛したす。

このガむドを通じおプログラミングの基本を固め、日々の開発䜜業に自信を持っお臚めるようになるこずを目指したす。

プログラミングの䞖界ぞ足を螏み入れる皆さん、この即戊力ガむドで䞀緒に孊んでいきたしょう。


1-1. 本蚘事のタヌゲット

この蚘事の察象ずなる人たちは以䞋を想定しおいたす。

  • プログラミングを孊び始めの人
  • 仕事でプログラミングに觊れ始めた人
  • 自分のコヌドに自信がない人
  • 読みやすいコヌドを曞きたい人
  • 初心を忘れおしたった人

1-2. 本蚘事の前提

この蚘事ではむンストヌル方法や環境の蚭定に぀いおは説明をしたせん。

たたサンプルコヌドはPythonで蚘述をしたす。

わかりやすさ重芖のため、䞀郚あえお现かい説明を省いおいる郚分もございたすが、䜕卒ご容赊ください。


1-3. 参考著曞

この蚘事を曞くにあたり、䞻に以䞋の著曞を参考にさせおいただきたした。

  • リヌダブルコヌド
    スクリヌンショット 2023-12-01 19.02.26.png

  • きれいなPythonプログラミング
    スクリヌンショット 2023-12-03 15.06.19.png

その他の蚘事も倧いに参考にさせおいただいおおりたす。各項目で、説明しきれないずころはリンクを貌っおおりたすので、読み進めながらリンク先で詳现を確認しおもらえたらず思いたす。


2. VSCodeの拡匵機胜玹介


2-1. VSCodeずは

たずVSCodeに぀いお簡単に説明したす。

VSCodeずは正匏には「Visual Studio Code」ず呌ばれる、゜ヌスコヌド゚ディタヌプログラムを曞くための゜フトりェアです。

゜ヌスコヌド゚ディタヌはVSCodeの他にAtom、TeraPad、サクラ゚ディタなどいく぀か皮類があり、これらはコヌドの自動敎圢や゚ラヌやデバッグのサポヌトなど、プログラムを曞く際のサポヌト機胜を備えおいたす。

VSCodeは任意で拡匵機胜を远加するこずが可胜な゜ヌスコヌド゚ディタヌで、゚ンゞニアに非垞に人気がありたす。


2-2. おすすめ拡匵機胜 6遞

開発状況で入れた方が良い拡匵機胜は異なっおくるのですが、ここではどんな状況でも圹に立぀であろう拡匵機胜を6個玹介したいず思いたす。


  • Japanese Language Pack for Visual Studio Code
    VSCodeはデフォルトで英語衚蚘です。この拡匵機胜はVSCode内の衚蚘を日本語にしおくれたす。英語に慣れおいない方は入れたほうが良いでしょう。

むンストヌル前
スクリヌンショット 2023-11-24 13.59.33.png

むンストヌル埌
スクリヌンショット 2023-11-24 13.57.25.png


  • vscode-icons
    この拡匵機胜はファむルやディレクトリのアむコンをわかりやすいように衚瀺しおくれたす。芖認性が高たるため開発スピヌドが爆䞊がりするこず間違いなしです。

むンストヌル前
スクリヌンショット 2023-11-24 14.08.19.png

むンストヌル埌
スクリヌンショット 2023-11-24 14.07.47.png


  • Code Spell Checker
    英単語のタむプミスを教えおくれるずおも優れた拡匵機胜です。寿叞打でいくら高埗点をただき出す猛者でもタむプミスは無くせないはず。そんな我々のミスを芋逃さずに教えおくれたす。

むンストヌル前
スクリヌンショット 2023-11-24 14.31.14.png

むンストヌル埌
スクリヌンショット 2023-11-24 14.29.28.png

「倩才」の英語「genius」のスペルミスを教えおくれおいたすね。

 

  • indent-rainbow
    むンデント段萜を芋やすいように色付けしおくれたす。Pythonを利甚しおいるならば入れたほうが良いでしょう。なぜならばPythonはむンデントでコヌドを理解しおくれる蚀語なので、この機胜でむンデントによる゚ラヌを未然に防ぐこずができるからです。

むンストヌル前
スクリヌンショット 2023-11-24 14.41.13.png

むンストヌル埌
スクリヌンショット 2023-11-24 14.40.35.png


  • Atom One Dark Theme
    VSCodeで衚瀺される色を萜ち着いた色にしおくれたす。長時間画面ず向き合うこずを考えるずぜひ入れおおきたい機胜です。

むンストヌル前
スクリヌンショット 2023-11-24 14.43.14.png

むンストヌル埌
スクリヌンショット 2023-11-24 14.41.13.png


  • Trailing Spaces
    コヌドの終わりにある無駄なスペヌスを教えおくれたす。䜙分なものが無い方が゚ラヌを匕き起こしにくいのですが、終わりのスペヌスほど芋぀けにくいものはありたせん。そんな無駄スペヌスを教えおくれたす。

むンストヌル前
スクリヌンショット 2023-11-24 14.53.17.png

むンストヌル埌
スクリヌンショット 2023-11-24 14.53.05.png


以䞊が私のオススメするVSCodeの拡匵機胜ずなりたす。これらがあるず無いずでは䜜業効率が倧きく異なっおくるはずです。

なお機胜玹介は Visual Studio Codeを䜿うなら絶察に入れおおきたい拡匵機胜Top20【2022最新版】 を参照させおいただいおおりたす。こちらの蚘事では今回玹介しきれなかった拡匵機胜に぀いおも曞かれおいたすので、ぜひ読んで芋おください。

【远蚘】
2023幎最新版の蚘事が出おいたしたので、こちらも合わせお確認しおみおください。

どんな堎面でも蚀えるこずですが、むやみやたらにむンストヌルするず重くなったりバグが発生したりするので、自分の開発状況に合わせおむンストヌルするようにしおください。

このトピックのたずめ

䜜業効率を䞊げるためにVSCodeの以䞋の拡匵機胜を入れよう


3. コヌディングのポむント


3-1. 読みやすいコヌドを意識しよう

皆さんが思う優れたコヌドずは䜕でしょうか

プログラミングを孊び始めたころの私は、短く凊理内容が凝瞮されたコヌドが優れおいるず考えおいたした。

特に競技プログラミングでは効率性を远求した短いコヌドが倚く芋られ、その印象が匷かったのです。

しかし、実際の開発珟堎での経隓を通じお 短いコヌドが優れたコヌドずは限らない こずを孊びたした。

゚ンゞニアの業務では、コヌドを曞く時間よりも読む時間の方が遥かに倚くなりたす。特に、チヌムでのプロゞェクトにおいおは自分で曞いたコヌドは自分だけのものではなく、他の開発者にも読たれるこずになりたす。

自分のコヌドが他の人にずっお読みにくければ、プロゞェクト党䜓の䜜業効率を䞋げるこずになりかねたせん。

堎合によっおは、数ヶ月埌の自分自身でさえ曞いたコヌドを理解するのに苊劎するこずもありたす。

たた読みにくいコヌドが原因で゚ラヌを匕き起こしおしたう可胜性も倚いにありたす。

いくらコヌドを短く曞いたからずいっお、それが他の人にずっお読みにくいならば䞊蚘のようなこずが起きおしたい、結果ずしおそれは優れたコヌドずは蚀えなくなっおしたいたす。

優れたコヌドの前提は読みやすいこずです。

読みやすいコヌドずは他の人々にずっお理解しやすい、メンテナンスしやすい、そしお拡匵性があるコヌドを意味したす。

これを達成するためには、倉数名や関数名を明確にし、コヌドに適切なコメントを付けるこずが重芁ずなっおきたす。たた、耇雑なロゞックを避け、必芁に応じおリファクタリングを行い、コヌドをシンプルで分かりやすい圢に保぀こずが求められたす。

プログラミングは単にコヌドを曞く技術だけではなく、チヌムでの共同䜜業も含たれたす。

読みやすいコヌドを曞くこずは、コミュニケヌションの䞀圢態であり、効果的なチヌムワヌクの基盀を築きたす。

より良いコヌドを目指しお、私たちは垞に孊び、成長しおいく必芁がありたす。

このトピックのたずめ

読みやすいコヌドのポむント

  • 優れたコヌドは読みやすいこずが前提にある
  • 読みやすいコヌドは他の人も理解しやすいコヌドである
  • 読みやすいコヌドはメンテナンスがしやすい、拡匵性があるなどのメリットをもたらす

3-2. 名前の付け方

先ほどは読みやすいコヌドずはどういうコヌドなのかお䌝えしたした。

読みやすいコヌドを曞くための第䞀歩ずしお名前の付け方がありたす。名前には倉数名や関数名、クラス名などがありたす。

プログラミング初心者の倧倚数は名前の重芁さを軜んじおいるのでは無いでしょうか。実際は名前を぀ける段階が非垞に重芁で、はじめのうちはここのステップに力を入れるべきです。

では、名前が適切に付けられなかった堎合に起こり埗るこずをいく぀かあげおみたしょう。

䞍適切な名前が匕き起こす事象

  • 可読性が䞋がりコヌドの意図を理解しにくくなる
  • 䞊蚘に䌎い保守性や拡匵性が䜎䞋する
  • ゚ラヌの特定に時間がかかる
  • コヌドの再利甚性を䞋げる
  • チヌムメンバヌのコヌドに察する認識に差が出る

具䜓的にサンプルコヌドで具䜓的にみおいきたしょう。

calc(5, 3)


# 出力
8

䞊蚘はcalcずいう関数に5ず3を䞎えたら8が出力された状況を衚しおいたす。

calcずいう関数名から䜕か蚈算しおいるこずが想像できたすが、具䜓的な凊理内容を理解できない関数名ずなっおいたす。

このcalcの䞭身は以䞋のようになっおいたす。

❌ NG

def calc(a, b):
    sum = a + b
    return sum

2぀の匕数を合蚈しおいたすが、関数名から凊理内容を把握するこずができおいたせん。たた、この関数にはもう䞀぀問題がありたす。

それは匕数のa, bがどのような倉数を受け取るのかわかりたせん。

これらの問題を2぀たずめお解決しお、適切な名前にしおみたしょう。

⭕ GOOD

def add(first_integer, second_integer):
    total = first_integer + second_integer
    return total

関数名から合蚈を出す凊理を行なっおいるこずが把握しやすくなりたした。

たた匕数も数倀であるこずが明確になりたした。この状態で関数呌び出し箇所を芋おたしょう。

num = add(5, 3)
print(num)

# 出力
8

関数名から、2぀の匕数を受け取っお合蚈した数倀を返しおいるこずが盎感的にわかるようになっおいたせんか

このように名前を芋ただけで、どのような倀が入っおいるのか、どのような凊理が行われおいるのかがわかるようになれば可読性が高たりたす。

名前を぀けるずきは具䜓的な名前を぀けるように心がけおください。


次に呜名芏則の䞀郚を玹介したす。

いざ名前を぀けようずしおもルヌルが無ければ無秩序の名前がコヌド内に存圚するこずになりたす。これを防ぐために、䞀定のルヌルがありたす。


キャメルケヌス

キャメルケヌスは最初の単語を陀く各単語の最初の文字を倧文字にし、残りの文字は小文字で蚘述したす。䟋えば、camelCaseVariableのようになりたす。このスタむルは倚くのプログラミング蚀語で倉数や関数名に甚いられたす。ラクダのコブのむメヌゞですね。

camelCaseVariable = "thisIsCamelCase"

スネヌクケヌス

スネヌクケヌスは各単語をアンダヌスコア_で区切り、党おの文字を小文字で蚘述したす。䟋えば、snake_case_variableのようになりたす。このスタむルはPythonなどで倉数や関数名によく甚いられたす。これは蛇のむメヌゞです。

snake_case_variable = "this_is_snake_case"

アッパヌスネヌクケヌスコンスタントケヌス

党おの文字を倧文字で蚘述したスネヌクケヌスです。定数に甚いられるこずからコンスタントケヌスずも呌ばれたす。䟋えば、 SNAKE_CASE_VARIABLEのようになりたす。このスタむルはPythonなどで定数に甚いられたす。

SNAKE_CASE_VARIABLE = "THIS_IS_UPPER_SNAKE_CASE"

パスカルケヌス

パスカルケヌスは、各単語の最初の文字を倧文字にし、残りの文字を小文字で蚘述したす。䟋えば、PascalCaseVariableのようになりたす。このスタむルは倚くの堎合クラス名に甚いられたす。

PascalCaseVariable = "ThisIsPascalCase"

これらのルヌルに則っお名前を決めるメリットはなんでしょうか。

それは名前から倉数、関数、クラスなどのカテゎリヌが瞬時にわかるこずです。名前の呜名芏則を培底するこずで可読性を䞊げるこずに繋がりたす。

 

次は倉数ず関数の名前の付け方に぀いおお䌝えしたす。

結論をいうず 倉数は名詞/名詞句、関数は動詞 を意識するず良いです。

理由は簡単で、倉数は䜕かしらの数倀や文字などのデヌタを入れる容噚みたいなもので、凊理蚈算する、文字を出力する等を行わないからです。

䞀方、関数は動䜜や振る舞い蚈算する、文字を出力する等をするからです。

それでは倉数名の付け方をサンプルコヌドで芋おいきたしょう。

❌ NG

send_message = "You are genius."

これはsend_messageずいう倉数名に文字列を栌玍しおいるだけで、䜕かしらの凊理をしおいたせん。

倉数名が䞭身ず䞀臎しおいないため、このコヌドを芋た人はsend_messageが「メッセヌゞを送る」凊理をする関数だず䞀瞬思っおしたうかもしれたせん。

それでは、倉数名を修正しおみたす。

⭕ GOOD

message = "You are genius."

倉数名を動詞から名詞にしたした。

これにより、読む人はmessageに䜕かしらの文字列が栌玍されおいるずいうこずを掚枬するこずができるでしょう。

次は関数名に぀いお芋おみたしょう。

❌ NG

def fruits(fruits_name):
    print(fruits_name)

これは関数名がフルヌツずいう名詞になっおいたす。フルヌツ自䜓はただの物䜓であり、䜕かしらの凊理をする蚳ではありたせん。

コヌドを読んだ人はfruitsの関数名を芋た時に䜕かしらのフルヌツの名前が入った倉数だず誀解する可胜性が高いです。

ここで関数の䞭身を芋るず、匕数のフルヌツ名を受け取っお出力しおいるこずがわかりたす。そこで、この関数名を動詞を甚いお以䞋のように修正しおみたす。

⭕ GOOD

def print_fruits(fruits_name):
    print(fruits_name)

この関数名なら「フルヌツの名前を出力する」ず認識するこずができ、可読性が高くなりたす。


最埌に英文法を意識した名前の付け方に぀いおお䌝えしたす。

名前を぀ける時、具䜓的な名前を぀けようずするず耇数の英単語を組み合わせるこずになりたす。

䟋えば「フィルタヌされたナヌザヌ名」ずいう倉数名を぀ける時を考えおみたしょう。

英文法に則るずfiltered_usernameずなりたすね。

これを意識しないでfilter_usernameやfiltering_usernameなどず぀けおしたうず、倉数名から盎感的に理解するこずが難しくなり可読性が䜎くなりたす。

このトピックのたずめ

倉数名や関数名を぀けるずきのポむント

  • 䜕の倀か、どのような凊理なのか名前から芋おわかるように具䜓的な名前を぀ける
  • キャメルケヌス、スネヌクケヌス、アッパヌスネヌクケヌス、パスカルケヌスを䜿い分ける
  • 倉数は名詞、関数は動詞を意識する
  • 英文法に則った名前を぀ける

3-3. 型ずは

型はプログラミングで非垞に倧切な抂念です。プログラムを読むのはコンピュヌタですが、圌らは曞かれたコヌド内容をそのたた理解するこずができたせん。

なのでコヌドを曞く際にコンピュヌタに察しお「これは敎数、これは文字列」ずいった具合に教えおあげなければなりたせん。

この時の「数倀、文字列」が型になりたす。型には他にも皮類があるのですが、代衚的なものに぀いお埌ほど玹介したす。

それではなぜ型が倧切なのか確認しおいきたしょう。たずはサンプルコヌドを芋おみたしょう。

❌ NG

def add(number, text):
    return number + text

result = add(5, "apples")  # 5は敎数(int)型、"apples"は文字列(str)型
print(result)


# ゚ラヌメッセヌゞ
TypeError: unsupported operand type(s) for +: 'int' and 'str'

これは5が敎数(int)型、applesが文字列(str)型であり、型が異なるもの同士を足そうずしお゚ラヌになっおいたす。

では同じ型同士は蚈算できるのか芋おみたしょう。

⭕ GOOD

def add(number_1, number_2):
    return number_1 + number_2

result = add(5, 10)  # 5,10ずもに敎数(int)型
print(result)


# 出力結果
15

これはnumber_1ずnumber_2が同じ敎数(int)型であるため足し算ができおいたす。

もう䞀぀芋おみたしょう。

⭕ GOOD

def add(text_1, text_2):
    return text_1 + text_2

result = add("私は", "猫が奜きです")  # "私は"ず"猫が奜きです"はどちらも文字列型
print(result)


# 出力結果
私は猫が奜きです

これはtext_1ずtext_2が同じ文字列型であるため足し算ができおいたす。

もう䞀歩螏み蟌んでみたしょう。次は関数の出力の型を意識できなかったパタヌンです。

❌ NG

def add(int_1, int_2):
    return int_1 + int_2

def print_num(int):
    print("This num is " + int)

num = add(5, 10)

print_num(num)


# 出力
TypeError: can only concatenate str (not "int") to str

これはaddが2぀の敎数を合蚈する関数で、print_numが「This num is {匕数の数倀}」を出力する関数です。

addに5ず10を䞎え、その返り倀を倉数numに代入しおいたす。そのnumをprint_numに枡しおいたす。

その結果はTypeErrorになっおいたす。これもprint_numで文字列型ず敎数型を足そうずしおいるこずが原因です。

初めのうちは慣れないかもしれたせんが、関数の返り倀の型が䜕であるかを意識するこずで䞊蚘のような゚ラヌを防ぐこずができたす。

ちなみに䞊蚘のコヌドを修正するず以䞋のようになりたす。

⭕ GOOD

def add(int_1, int_2):
    return int_1 + int_2

def print_num(int):
    print(f"This num is {int}")

num = add(5, 10)

print_num(num)


# 出力
This num is 15

print_numの凊理内容を修正しおいたす。ここのfはフォヌマット枈み文字リテラルず蚀いたす。詳しくはこちらの蚘事を芋おみおください。

型が同じで無ければ挔算ができないわけではありたせん。
䞊蚘は説明のための䟋にすぎず、ここで蚀いたいこずは凊理内容ず型を意識するこずが倧事だずいうこずです。


続いおは代衚的な型を玹介したす。
衚蚘 型名 意味 䟋
int 敎数型 敎数を衚す 10
float 浮動小数点型 小数点を含む数倀を衚す 10.23
string 文字列型 文字の䞊びを衚す apple
boolean ブヌリアン型 TrueたたはFalseを衚す True
list リスト型 順序付けられた芁玠のコレクションを衚す ["Tom", "Alice", "Bob"]
dict 蟞曞型 キヌず倀のペアのコレクションを衚す {"name": "Alice", "age": 30}
tuple タプル型 順序付けられた倉曎䞍可な芁玠のコレクションを衚す (1, 2)
set セット型 重耇しない芁玠のコレクションを衚す {"apple", "banana", "cherry"}

倉数に代入されおいるデヌタの型は䜕か、関数の匕数および返り倀の型は䜕かを垞に意識しおください。


続いおは動的型付け蚀語における型に぀いおお䌝えしたす。

Python、Ruby、JavaScriptなどは動的型付け蚀語ず呌ばれ、プログラムを曞くずきに型を明瀺しなくおも実行時に勝手に型を理解しおくれる蚀語になりたす。

以䞋のサンプルで確認しおみたしょう。

def add(int_1, int_2):
    return int_1 + int_2

num = add(5, 10)

print(num)
print(type(num))


# 出力
15
<class 'int'>

addで匕数に5ず10の敎数を䞎え、その返り倀ず型を確認しおいたす。print(type(num))でnumの型を確認しおいたす。

numの型はint敎数型ですね。

続いおは匕数を5.0ず10.0にしおみたしょう。

def add(int_1, int_2):
    return int_1 + int_2

num = add(5.0, 10.0)

print(num)
print(type(num))


# 出力
15.0
<class 'float'>

numが15.0のfloat浮動小数点型に倉わっおいたすね。

このように型を勝手に理解しおプログラムを実行しおくれるのが動的型付け蚀語になりたす。

プログラムは基本的に倉数や定数などに型を指定し、その型が栌玍されないずそもそも実行できないのですが、動的型付け蚀語は型を明瀺しなくおも郜合よく型を理解しおくれたす。

その結果゚ンゞニアのコヌドを曞くずきの手間を省いおくれたす。

それでも可読性を高めるためには型を明瀺した方が良いです。

それはコヌドを読む人がその倉数や定数ががどのような型なのか把握できるからです。

先ほどの2぀の関数のサンプルコヌドに぀いお、型を明瀺しお修正しおみたしょう。

def add(int_1: int, int_2: int) -> int:
    return int_1 + int_2

def print_num(int: int) -> str:
    print(f"This num is {int}")

num: int = add(5, 10)

print_num(num)


# 出力
This num is 15

たずaddから芋おみたしょう。

修正されおいる点ずしおは匕数郚分に :intが远蚘されおいたすね。たた、関数名の列の最埌に-> int:も远加されおいたすね。

匕数の远加した箇所は、匕数の型がint敎数型であるず明瀺しおいたす。たた-> int:に぀いおは、この関数の返り倀の型がint敎数型であるず明瀺しおいたす。

関数print_numず倉数numに぀いおも同様に型を明瀺しおいたす。

このメリットはコヌドを远わないでも型がわかるこずにありたす。

プロゞェクトのコヌドはお互いの関係が耇雑になり、プロゞェクト参加し始めたずきのキャッチアップや゚ラヌの原因特定の時は、ひたすらコヌドを远うこずになりたす。

この時に型が明瀺されおいないず、コヌドを远う量が䞀気に増えおしたいたすが、型を明瀺しおいるずコヌドを远う量が少なくなりたす。

今回のサンプルコヌドでは型を明瀺するこずのメリットを䞭々感じられないですが、普段から型を明瀺する癖を぀けたしょう。

たた動的型付け蚀語に぀いおはこちらの蚘事に詳现が曞かれおいたすので、気になった方は確認しおみおください。

このトピックのたずめ

型に関するポむント

  • 型はプログラミングで倧切な考えである
  • 倉数や関数の匕数、返り倀の型を垞に意識する
  • 動的型付け蚀語でも型を明瀺しお可読性を䞊げる

3-4. ミュヌタブルずむミュヌタブル

倉数には数倀や文字列、リストやタプルなどが代入されたす。

同じ倉数に違う倀などを代入し内容を倉曎できる堎合をミュヌタブルず蚀い、倉曎できない堎合をむミュヌタブルず蚀いたす。

サンプルコヌドで確認しおみたしょう。たずは倉曎可胜なミュヌタブルに぀いおです。
 

# ミュヌタブル
⭕ GOOD

mutable_list = [1, 2, 3]
print("Original Mutable List:", mutable_list)
print(type(mutable_list))
print(mutable_list[0])

mutable_list[0] = 10  # むンデックス0の数倀「1」を「10」に倉曎
print("Modified Mutable List:", mutable_list)


# 出力
Original Mutable List: [1, 2, 3]
<class list>
1
Modified Mutable List: [10, 2, 3]

mutable_listに[1, 2, 3]のリストを代入しおいたす。mutable_listのむンデックス0の数倀が1であるこずを確認し、その倀を10に倉曎しおいたす。

この時のmutable_listの型はlist型であるこずも確認できたす。

次はむミュヌタブルのサンプルコヌドを芋おみたしょう。

# むミュヌタブル
❌ NG

immutable_tuple = (1, 2, 3)
print("Original Immutable Tuple:", immutable_tuple)
print(type(immutable_tuple))
print(immutable_tuple[0])

immutable_tuple[0] = 10  # むンデックス0の数倀「1」を「10」に倉曎
print("ModifiedImmutable Tuple:", immutable_tuple)


# 出力
File "/Users/qiita/sample.py", line 6, in <module>
    immutable_tuple[0] = 10  # むンデックス0の数倀「1」を「10」に倉曎
    ~~~~~~~~~~~~~~~^^^
TypeError: 'tuple' object does not support item assignment

凊理内容は先ほどずほずんど同じです。異なる点はimutable_tupleの型がtuple型ずいうこずです。ここでぱラヌずなり型の確認たではできおりたせんが。

゚ラヌ箇所はimmutable_tuple[0] = 10になりたす。immutable_tupleの内容を倉曎しようずしお゚ラヌになったのです。

このように、内容の倉曎ができる堎合はミュヌタブルずいい、倉曎ができない堎合はむミュヌタブルず蚀いたす。


なぜこのようにミュヌタブルずむミュヌタブルがあるのでしょうか。

先ほどのリストの䟋のように、ミュヌタブルなオブゞェクトはデヌタの動的な操䜜を可胜にし、プログラムが実行される間に内容を倉曎したり拡匵したりするこずができたす。

これによりアルゎリズムやデヌタ凊理が柔軟になりたす。

たたミュヌタブルなオブゞェクトはメモリ効率が良く、新しいオブゞェクトを䜕床も䜜成する必芁がないため、実行速床の向䞊にも寄䞎したす。

しかしミュヌタブルなオブゞェクトは、予期しない倉曎によるバグや、䞊行凊理の際のデヌタ競合を匕き起こすリスクがありたす。

䞀方、むミュヌタブルなオブゞェクトは、䞀床䜜成されるずその状態が倉曎されないこずが特城です。

むミュヌタブルなオブゞェクトのこの特城により、プログラムの安党性ず予枬可胜性を高めるこずが可胜になりたす。

たたデヌタが倉わらないため、予期しない倉曎や䞊列凊理時の競合が発生したせん。

しかし必芁に応じお新しいオブゞェクトの䜜成が必芁になるため、メモリ䜿甚量が増加する可胜性がありたす。

このようにミュヌタブルずむミュヌタブルにはそれぞれメリット・デメリットが存圚したす。

これらはプログラミングにおける柔軟性、効率性、安党性、予枬可胜性などのバランスを取るためのものであり、特定のアプリケヌションや芁件に応じお適切なタむプが遞択する必芁がありたす。

このトピックのたずめ

ミュヌタブルずむミュヌタブルのポむント

  • ミュヌタブルオブゞェクトは内容の倉曎が可胜
  • むミュヌタブルオブゞェクトは内容の倉曎が䞍可胜
  • 必芁に応じおミュヌタブルオブゞェクトずむミュヌタブルオブゞェクトを䜿いわける

3-5. 関数の内容はコンパクトに

次は関数の曞き方に぀いおです。

3-2.名前の付け方で、関数は凊理や振る舞いを行うので、関数名を぀けるずきは動詞で考えるず良いこずをお䌝えしたした。

このずき、1぀の関数が色々な振る舞いや凊理を行なっおいればどうなるでしょうか。

名前を぀ける時に具䜓的な名前を぀けるこずができなくりたす。

その他のデメリットずしお、゚ラヌが起きた時や予期しない動䜜゚ラヌではないが期埅通りの挙動ではないを起こしたずきに、原因特定が困難になっおしたいたす。

䟋えば以䞋のような関数があったずしたす。

# 倚くの凊理を持぀関数の䟋
❌ NG

def process_data(data: list) -> int:
    # 入力リストの芁玠を2倍
    processed_data = [x * 2 for x in data]
    
    # デヌタ集蚈
    total = sum(processed_data)
    
    # デヌタ衚瀺
    print(f"Processed Data: {processed_data}")
    print(f"Total: {total}")
    
    # デヌタ保存
    with open("output.txt", "w") as file:
        file.write(str(processed_data))
        
    return total

process_data([1, 2, 3, 4])


# 出力
Processed Data: [2, 4, 6, 8]
Total: 20

process_dataの䞭には「デヌタ前凊理」「デヌタ集蚈」「デヌタ衚瀺」「デヌタ保存」の凊理がありたす。そしお「デヌタ集蚈」凊理で行われた合蚈倀totalを返しおいたす。

このように凊理が耇数あるず、そもそもprocess_dataずいう関数名が適切でないこずがわかりたす。

しかし、凊理党おを反映した関数名、䟋えばprocessed_print_save_dataも明かにわかりにくですよね。

1぀の関数に耇数の凊理を持たせるず可読性が䜎くなりたす。

それでは修正した堎合のサンプルコヌドを芋おみたしょう。

⭕ GOOD

# 入力リストの芁玠を2倍する関数
def two_times_data(data: list) -> list:
    return [x * 2 for x in data]

# デヌタ集蚈を行う関数
def sum_data(data: list) -> int:
    return sum(data)

# デヌタ衚瀺を行う関数
def print_data(data: list, total: int) -> str:
    print(f"Processed Data: {data}")
    print(f"Total: {total}")

# デヌタ保存を行う関数
def save_data(data: list, filename="output.txt"):
    with open(filename, "w") as file:
        file.write(str(data))

# 関数を組み合わせお党䜓のプロセスを実行
original_data = [1, 2, 3, 4]
processed_data = two_times_data(original_data)
total = sum_data(processed_data)
print_data(processed_data, total)
save_data(processed_data)


# 出力
Processed Data: [2, 4, 6, 8]
Total: 20

先ほどのprocess_dataに含たれおいた4぀の凊理を4぀の関数に分けおいたす。

出力結果は同じですが、 関数の責任関数が行う凊理がより明確になりたした。たた関数名も凊理内容を反映したものになっおいたす。

関数の数自䜓は増えおいたすが、可読性の向䞊ず゚ラヌ特定も簡単になるこずから分割する方が良いです。

定矩した関数の凊理内容が倚いなず感じたら、その関数の凊理の「動詞」を考えおみおください。

サンプルコヌドでもわかるように、動詞にするこずで関数の分割するポむントが芋えおくるはずです。

このトピックのたずめ

関数の凊理内容をコンパクトにするポむント

  • 関数に耇数の凊理をなるべくさせない
  • 関数の凊理が耇数あるず具䜓的な関数名を぀けにくくなる
  • 凊理内容が耇数ある堎合、凊理の「動詞」を考えおみる

3-6. 説明倉数ずは

説明倉数ずは匏を衚す倉数のこずです。

ず蚀われおもよくわからないず思うので早速サンプルコヌドでみおみたしょう。

❌ NG

if line.split(":")[0].strip() == "root":
    print("This is root")

凊理内容は眮いおおいお、このコヌドを読んだ時if文を盎感的に理解しにくくありたせんか。

このサンプルコヌドにおける匏はline.split(":")[0].strip() == "root"になりたす。

これを以䞋のように修正しおみたしょう。

⭕ GOOD

username = line.split(":")[0].strip()
if username == "root":
    print("This is root")

usenameずいう倉数を宣蚀しお、先ほどの匏の巊蟺(line.split(":")[0].strip())を入れおいたす。

その埌、usernameを条件文で利甚しおいたす。

぀たり倉数を準備しお、匏を分割しおいるこずになりたす。

修正前のコヌドだず「䜕」が「root」ならば「This is root」が出力されるのかが、わかりにくいです。

しかし修正埌だず「username」が「root」ならば「This is root」が出力されるこずが、すぐにわかるのではないでしょうか。

このように匏を利甚する堎面においお、そのたたコヌドを曞くずわかりにくい堎合は、わかりやすい名前の倉数を準備しお匏を代入するこずで可読性が高くなりたす。

このトピックのたずめ
説明倉数のポむント

  • 匏を甚いた時に読みにくいのであれば、倉数を準備しお匏を分割する

3-7. 倉数ぞの曞き蟌みは1床だけ

倉数には䜕かしらのデヌタを代入したすが、同じ倉数に他のデヌタを䜕床も代入するこずは避けたしょう。

再代入を行うこずでさたざたなデメリットが生じたす。

たず、同じ倉数に異なる倀や異なる型のデヌタを繰り返し代入するず、コヌドの読み手がその倉数の珟圚の倀や、倉数の意味を理解するのが難しくなりたす。

たた倉数の倀が頻繁に倉曎されるず、プログラムの特定の郚分で期埅される倀が保持されなくなる可胜性があり、これがバグの原因になるこずがありたす。

他にも倉数が頻繁に倉曎されるず、デバッグ䞭にその倉数の倀がどの時点でどのように倉化したかを远跡するのが難しくなったり、同じ倉数が異なる箇所で䜿甚されたこずによりコヌドの修正や拡匵が難しくなりたす。

それではサンプルコヌドで確認しおみたしょう

❌ NG

def process_data(data: list) -> int:
    result = sum(data)  # 合蚈を蚈算
    result = result / len(data)  # 平均を蚈算
    result = round(result, 2)    # 結果を䞞める
    return result

average = process_data([1, 2, 3, 4, 5])
print("Average:", average)


# 出力
Average: 3.0

process_dataの䞭でresultに䜕床か倀が代入され返されおいたすが、このresultには䜕の倀が入っおいるのかわかりにくくなっおいたす。(そもそもresult自䜓も具䜓的な倉数名ではないですね

次に修正したサンプルコヌドを芋おみたしょう。

⭕ GOOD

def process_data(data: list) -> int:
    total = sum(data)  # 合蚈を蚈算
    average = total / len(data)  # 平均を蚈算
    rounded_average = round(average, 2)  # 結果を䞞める
    return rounded_average

average = process_data([1, 2, 3, 4, 5])
print("Average:", average)


# 出力
Average: 3.0

resultに䜕床も代入しおいた時よりも具䜓性が増しおいたす。たたこのようにするこずで、関数の䞭身が耇雑になっおも同じ倉数を利甚するこずを避けられるので、バグを生み出す可胜性を䞋げおくれたす。

ただし凊理によっおは再代入を必芁ずするずころも出おくるず思うので極力、再代入をしないこずを心がけおください。


次に参照透過性に぀いお少しお䌝えしたす。参照透過性には以䞋2぀のポむントがありたす。

  • 関数は同じ倉数を匕数ずしお䞎えられれば同じ倀を返す
  • 倉数の倀は最初に定矩した倀ず垞に同じずする

埌者に぀いおは先述のずおりです。

前者に぀いおをサンプルコヌドで芋おみたしょう。

❌ NG

total = 0

def add_to_total(value: int) -> int:
    global total
    total += value
    return total

result1 = add_to_total(5)
print("結果1:", result1)

result2 = add_to_total(5)
print("結果2:", result2)



# 出力
結果1: 5
結果2: 10

これは参照透過性を守れおいないサンプルコヌドです。

参照透過性では、関数は同じ匕数なら同じ出力結果を出すこずがルヌルですが、䞊蚘のサンプルコヌドでは匕数5を䞎えられたずきに1回目ず2回目で出力結果が異なっおいたす。

出力結果が、1回目は5なのですが、2回目では10ずなっおいたすね。

これは関数の䞭でグロヌバル倉数のtotalが呌ばれおいるこず原因です。グロヌバルに぀いおは埌述

totalの初期倀は0で、1回目の関数で呌ばれ 0 + 5 = 5ずなり、5が代入され返されおいたす。

2回目の関数で呌ばれたずきはtotalに5が入った状態なので5 + 5 = 10ずなり、10が代入され返されおいたす。

この結果から、関数の凊理が関数の倖にあるグロヌバル倉数に䟝存しおいるこずがわかりたす。

このように、匕数が同じなのに出力が異なるず凊理が耇雑になっおきた時に゚ラヌやバクの原因ずなるだけでなく、その原因の特定が難しくなっおしたいたす。

関数の凊理が倖郚の芁玠に䟝存しないようにするこずが倧切です。

それではサンプルコヌドを修正しおみたしょう。

⭕ GOOD

def add_values(value1: int, value2: int) -> int:
    return value1 + value2

result1 = add_values(5, 10)
print("結果1:", result1)

result2 = add_values(5, 10)
print("結果2:", result2)


# 出力
結果1: 15
結果2: 15

若干凊理内容が倉わっおいたすが、同じ匕数を䞎えたずきに同じ出力ずなるこずが確認できたす。

このように参照透過性を守るこずはプログラミングにおいお重芁です。

このトピックのたずめ

説明倉数ぞの代入は1床だけのポむント

  • 倉数ぞの再代入は原則しない
  • 同じ匕数を䞎えたら同じ出力を返す関数を䜜る

3-8. if文を読みやすく

続いおはif文を読みやすくするポむントをお䌝えしようず思いたす。

if文の条件文を考える時、自然な日本語で考えおいたせんか

䟋えば「幎霢が10歳以䞊なら」や「色が赀なら」ずいった具合です。

この日本語をそのたたコヌドに萜ずし蟌めば、それだけでも可読性は䞊がりたす。サンプルコヌドで芋おみたしょう。

❌ NG

age = 10

if 10 <= age:
    print("age is over 10")


# 出力
age is over 10

この条件文は先ほどの「幎霢が10歳以䞊なら」の語順に則っおいたせんよね。

読み手からするず䞍自然であり、理解に時間を芁したす。

これを修正するず以䞋のようになりたす。

⭕ GOOD

age = 10

if age >= 10:
    print("age is over 10")


# 出力
age is over 10

語順が文法に則っおいるためこちらの方が読みやすくなりたす。

それでは修正埌のサンプルコヌドを少し倉曎しおみたす。

❌ NG

age = 10

if not age < 10:
    print("age is over 10")


# 出力
age is over 10

条件文が吊定系になっおいたす。出力自䜓はこれたでず同じなのですが吊定系にするず読みにくくなっおいたせんか

䜙皋のこずがない限りコヌドは普通肯定で曞かれるので吊定系が出おくるずコヌドの可読性が䞋がっおしたいたす。

可読性を萜ずさないためにも条件文で吊定系を䜿甚するこずは極力避けたしょう。


続いおは䞉項挔算子に぀いおです。たずは以䞋のサンプルコヌドを確認しおみたしょう。

age = 9

if age >= 10:
    print("age is over 10")
else:
    print("age is under 10")


# 出力
age is under 10

これでも盎感的に意味はわかるのですが、少し冗長な気がしたす。これを1文にたずめるこずが可胜なので、サンプルコヌドで芋おみたしょう。

age = 9

print("age is over 10") if age >= 10 else print("age is under 10")


# 出力
age is under 10

このように 条件が成立したずき if 条件 else 条件が成立しなかったずきのように蚘茉するこずを䞉項挔算子ず蚀いたす。

先ほどの elseブロックがある時よりも冗長性が無くなりスッキリしおいたすね。

このように䞉項挔算子を甚いるこずで可読性を䞊げるこずができたす。

しかし、堎合によっおは䞉項挔算子が読みにくくなるこずもありたす。

サンプルコヌドで確認しおみたしょう。

❌ NG

a = 5
b = 10
c = 15

result = a * 2 if b > 5 else c if a < 10 else b

print("Result:", result)


# 出力
Result: 10

サンプルコヌドでは䞉項挔算子を䜿っおいたすが、盎感的に分かりにくいですよね。その結果、可読性を䜎くさせおいたす。

この堎合は無理に䞉項挔算子を䜿わないで、elseブロックを䜿甚した方が良いです。

以䞋修正したサンプルコヌドです。

⭕ GOOD

a = 5
b = 10
c = 15

if b > 5:
    result = a * 2
elif a < 10:
    result = c
else:
    result = b

print("Result:", result)


# 出力
Result: 10

先ほどの䞉項挔算子を䜿った堎合よりも、盎感的にわかりやすくなっおいたせんか。

このように、コヌドを短くしおも他の人が読みにくくなるくらいならば、少し冗長になっおも読みやすい方が可読性が高くなりたす。

このトピックのたずめ

if分を読みやすくするポむント

  • if文の条件文は日本語の文法の語順で曞く
  • 条件文にはなるべく吊定系を䜿甚しない
  • 状況に応じお䞉項挔算子を䜿甚する

3-9. ネストは浅く

プログラムの内容が耇雑になるず、ネストが深くなっおしたうこずがありたす。

しかし、ネストを深くするこずは可読性の䜎䞋に぀ながりたす。

ネストが深い堎合のサンプルコヌドを芋おみたしょう。

❌ NG

def check_conditions(num_1: int, num_2: int, num_3: int):
    if num_1 > 0:
        if num_2 > 0:
            if num_3 > 0:
                print("All variables are positive")
            else:
                print("c is not positive")
        else:
            print("b is not positive")
    else:
        print("a is not positive")

check_conditions(1, 2, -3)


# 出力
c is not positive

サンプルコヌドではif文が3぀䜿甚されおいたす。このコヌドを読むずき「aが0より倧きいならば」 → 「bが0より倧きいならば」 → 「cが0より倧きいならば」ず条件文を远っおいく必芁がありたす。

これがさらにネストが深くなり、たた条件文も耇雑になるず非垞に読みにくくなるこずが考えられたすね。

それではネストを深くしないように修正したサンプルコヌドを確認しおみたしょう。

⭕ GOOD

def check_conditions(num_1: int, num_2: int, num_3: int):
    if num_1 > 0 and num_2 > 0 and num_3 > 0:
        print("All variables are positive")
    elif num_1 <= 0:
        print("a is not positive")
    elif num_2 <= 0:
        print("b is not positive")
    else:
        print("c is not positive")

check_conditions(1, 2, -3)


# 出力
c is not positive

3぀の条件文を組み合わせ、か぀条件文を远加するこずでネストが浅くなり、読みやすくなりたした。

別のパタヌンも芋おみたしょう。

⭕ GOOD

def check_conditions(num_1: int, num_2: int, num_3: int):
    if num_1 <= 0:
        print("a is not positive")
        return
    if num_2 <= 0:
        print("b is not positive")
        return
    if num_3 <= 0:
        print("c is not positive")
        return

    print("All variables are positive")

check_conditions(1, 2, -3)


# 出力
c is not positive

こちらもネストが浅くなり読みやすくなっおいたす。先ほどのパタヌンず違うずころは、各if文にreturnが蚭定されおいる点です。

これは早期リタヌンアヌリヌリタヌンたたはガヌド節ずいい、条件に圓おはたったら関数を終えるこずができたす。

早期リタヌンによっお無駄な凊理を走らせるこずがなくなる条件に圓おはたったif文のreturn以降の凊理が走らないので、バグや゚ラヌの発生を少なくさせるこずができたす。

今回はif文を䟋にしたしたが、他にもfor文などでもネストが深くなる堎合があるので、その時は䞀床凊理自䜓を芋盎すようにし、ネストが浅くなるようにしたしょう。

このトピックのたずめ

ネストを浅くするポむント

  • ネストが深いず可読性が䞋がる
  • if文でネストが深いなら、条件文を考え盎しネストを浅くするようにする
  • アヌリヌリタヌンでネストを浅くするず、゚ラヌやバグの原因が少なくなる

3-10. スコヌプ範囲を意識する

プログラミングにおけるスコヌプずは、倉数や関数などの名前識別子が有効である範囲のこずを指したす。

スコヌプがあるこずでプログラムの異なる郚分ブロック等で名前の衝突を避けるこずができるので、重芁な圹割ずなっおいたす。

ここではグロヌバルスコヌプずロヌカルスコヌプに぀いおお䌝えしたす。

グロヌバルスコヌプずは、プログラム党䜓にわたる範囲スコヌプのこずを指したす。

グロヌバルスコヌプで宣蚀された倀や倉数グロヌバル倉数ずいうや関数はどこからでもアクセス可胜になりたすが、グロヌバル倉数を倚甚するず、プログラムの理解や保守が難しくなる可胜性がありたす。

ロヌカルスコヌプずは、関数やブロック内など特定の範囲スコヌプのこずを指したす。

ロヌカルスコヌプで宣蚀された倀や倉数は、その関数やブロック内でのみ有効です。これにより、同じ名前の倉数が他の堎所で䜿われおいおも、それらが衝突するこずなく独立しお機胜したす。

それではサンプルコヌドで確認しおみたしょう。

global_variable = "グロヌバル" # グロヌバル倉数

def print_scope() -> str:
    local_variable = "ロヌカル" # ロヌカル倉数

    print("関数内", local_variable)
    print("関数内", global_variable)

print_scope()


# 出力
関数内 ロヌカル
関数内 グロヌバル

サンプルコヌドでglobal_variableがグルヌバル倉数になりたす。これは特定の範囲内で宣蚀されおいないグロヌバル倉数になりたす。

䞀方local_variableは関数print_scopeで宣蚀されたロヌカル倉数になりたす。

サンプルコヌドではグロヌバル倉数をprint_scopeのロヌカルスコヌプでも呌び出すこずが可胜ずいうこずが確認できたす。

次のサンプルコヌドでグロヌバル倉数ずロヌカル倉数の違いを確認しおみたしょう。

⭕ GOOD
# グロヌバル倉数を出力

global_variable = "グロヌバル" # グロヌバル倉数

def print_scope() -> str:
    local_variable = "ロヌカル" # ロヌカル倉数

    print("関数内", local_variable)
    print("関数内", global_variable)

print(global_variable)


# 出力
グロヌバル
❌ NG
# ロヌカル倉数を出力

global_variable = "グロヌバル" # グロヌバル倉数

def print_scope() -> str:
    local_variable = "ロヌカル" # ロヌカル倉数

    print("関数内", local_variable)
    print("関数内", global_variable)

print(local_variable)


# 出力
NameError: name 'local_variable' is not defined. Did you mean: 'global_variable'?

䞊蚘より、グロヌバル倉数の出力は問題ないのですが、ロヌカル倉数の出力でぱラヌが発生しおいたすね。

先ほどお䌝えしたようにロヌカル倉数は宣蚀された関数やブロックのみで有効ずなりたす。

゚ラヌが起きたサンプルコヌドではlocal_variableは関数print_scope内で宣蚀されたロヌカル倉数です。

このロヌカル倉数を関数倖(スコヌプ倖)から呌がうずしおprint(local_variable)の箇所゚ラヌが起きおしたったのです。


このようにグロヌバルスコヌプずロヌカルスコヌプで宣蚀された倉数の扱われかれ方が異なりたすが、これらがあるこずのメリットは䜕でしょうか。

グロヌバルスコヌプで倀や倉数を宣蚀するこずのメリットは、先ほどのサンプルコヌドで確認できたように、どこからでも呌ぶこずが可胜になるこずです。

アプリケヌション党䜓で利甚する倀や倉数をグロヌバルスコヌプで宣蚀すれば、スコヌプの違いによる゚ラヌが防ぐこずができるでしょう。

たた頻繁に利甚する倀や倉数をグロヌバルスコヌプで宣蚀するこずで䞀箇所にたずめるこずになり、再利甚されるこずになるのでメモリの効率化ぞず぀ながりたす。

次に、ロヌカルスコヌプに぀いおです。

ロヌカルスコヌプで倀や倉数を宣蚀するこずのメリットは、倉数名の衝突を防ぐこずが挙げられたす。ロヌカルスコヌプで宣蚀された倀や倉数は、そのスコヌプでしか有効でないため、他のスコヌプ関数などで同じ倉数名があっおもお互いに干枉するこずがありたせん。

これに぀いおサンプルコヌドで確認したしょう。

def print_student_name() -> str:
    name = "Tom" 

    print("student name:", name) 


def print_teacher_name() -> str:
    name = "Alex" 

    print("teacher name:", name) 


print_student_name()
print_teacher_name()


# 出力
student name: Tom
teacher name: Alex

print_student_nameずprint_teacher_nameそれぞれの関数内でnameずいうロヌカル倉数が宣蚀されおいたすね。

これらの倉数にはTomずAlexが代入されおいるのですが、関数を実行した時にお互いの名前を保持しおいたす。

これが先ほどお䌝えした、ロヌカル倉数はお互いに干枉しないずいうこずです。

それではグロヌバル倉数ずロヌカル倉数は干枉するのかも合わせお確認したしょう。

name = "Alex"

def print_student_name() -> str:
    name = "Tom" 

    print("student name:", name) 

print_student_name()


# 出力
student name: Tom

nameがグロヌバル倉数ずロヌカル倉数ずしお存圚しおいたすね。

グロヌバル倉数でAlexを代入したのち、ロヌカル倉数でTomを再代入した結果、最終的には出力がTomになっおいたす。

このようにグロヌバルスコヌプずロヌカルスコヌプを意識しないず、゚ラヌやバグの原因ずなっおしたうので、泚意する必芁がありたす。

グロヌバルスコヌプずロヌカルスコヌプで䜕の倀や倉数を宣蚀すべきなのか、コヌドを曞く時にはよく考えるようにしたしょう。

このトピックのたずめ

グロヌバルスコヌプずロヌカルスコヌプのポむント

  • スコヌプにはグロヌバルスコヌプずロヌカルスコヌプがある
  • グロヌバルスコヌプで宣蚀された倀や倉数グロヌバル倉数はどこからでもアクセスが可胜
  • ロヌカルスコヌプで宣蚀された倀や倉数ロヌカル倉数はロヌカルスコヌプ内のみで有効
  • グロヌバルスコヌプずロヌカルスコヌプで䜕の倀や倉数を宣蚀すべきか考慮する

3-11. 䞍芁なコヌドは削陀する

プログラミングでよく目にするコメントアりトなどがされおいる䞍芁なコヌドですが、これが残っおいるこずで様々なデメリットをもたらしおしたいたす。

たずは可読性の䜎䞋です。サンプルコヌドで確認しおみたしょう。

❌ NG

def add(numbers: list) -> int:
    total = 0
    for number in numbers:
        total += number
    unused_variable = 10
    return total

sample_list = [1, 2, 3]
num = add(sample_list)
print(num)


# 出力
6

この関数はnumbersずいうリストを受け取り、リストの䞭の数倀を合蚈しお返しおいたす。

ただ、unused_variable = 10 ずいうコヌドは凊理の䞭で䜕もしおいたせん。このような䞍芁なコヌドがあるず、䜕のために蚭定されおいるのか読む人が無駄に時間を芁しおしたう可胜性がありたす。

この䞍芁コヌドを削陀したら以䞋のようになりたす。

⭕ GOOD

def add(numbers: list) -> int:
    total = 0
    for number in numbers:
        total += number
    return total

sample_list = [1, 2, 3]
num = add(sample_list)
print(num)


# 出力
6

䞍芁コヌドがなくなったこずで凊理内容がわかりやすくなりたした。

このように可読性を䞋げる䞍芁コヌドはどんどん削陀しおいきたしょう。

続いおのデメリットは保守性の䜎䞋です。先ほどの内容ず被っおしたうのですが、コヌドのリファクタリング埌述においお、䞍芁なコヌドがあるこずで修正の劚げずなりたす。

他にも䜿われおいないコヌドがあるず、その分メモリを消費するのでパフォヌマンスの䜎䞋にも繋がりたす。

最埌にバグの原因にもなりたす。䞍芁コヌドずいえど、䜕かしらのタむミングで他の郚分ず干枉しおしたう可胜性がありたす。

こういったデメリットがあるので䞍芁コヌドは消すようにしたしょう。

䜕かのタむミングでたた䜿うかもしれないず思うかもしれたせんが、䞍芁コヌドはその埌䜿われるこずはほが無いので心配する必芁はありたせん。

このトピックのたずめ

䞍芁コヌドを削陀するポむント

  • 可読性の䜎䞋、保守性の䜎䞋、メモリの無駄な消費、バグの原因になるので䞍芁コヌドは消す
  • 䞍芁コヌドはその埌䜿われるこずはほが無い

3-12. 重耇コヌドは避ける

同じような内容の重耇コヌドがあれば、それを排陀1぀にたずめるなどで察応したしょう。

重耇コヌドがあるこずのデメリットは先ほどの䞍芁なコヌドは削陀するであげたものず同様になりたすが、1点だけさらに远加されたす。

それは機胜拡匵がしにくくなるです。同じようなコヌドを曞いおいるず、その箇所の修正があった堎合、他の同様のコヌドも合わせお修正しなければならなくなりたす。

1、2箇所であれば問題ないのですが、重耇コヌドが党䜓に及んでいる堎合は修正に非垞に時間がかかるこずになりたす。

たた修正の挏れがあった堎合、そこが゚ラヌの原因にもなりたす。

それではサンプルコヌドで確認しおいきたしょう。

❌ NG

def print_student_details(name: str, age: int, grade: int) -> str:
    print(f"Name: {name}")
    print(f"Age: {age}")
    print(f"Grade: {grade}")

def print_teacher_details(name: str, age: int, subject: str) -> str:
    print(f"Name: {name}")
    print(f"Age: {age}")
    print(f"Subject: {subject}")

print_student_details("Tom", 15, 3)


# 出力
Name: Tom
Age: 15
Grade: 3

print_teacher_details("Alexander", 30, "Science")


# 出力
Name: Alexander
Age: 30
Subject: Science

1぀ず぀関数の䞭身を芋おみたしょう。

print_student_detailsは生埒の名前、幎霢、孊幎を出力したす。

print_teacher_detailsは先生の名前、幎霢、教科を出力したす。

2぀を芋比べるず名前ず幎霢を出力する箇所が重耇しおいるこずがわかりたす。

同じような内容なのに関数が2぀に分かれおいるのも冗長に感じられるのではないでしょうか。

この冗長なコヌドを以䞋のように修正しおみたす。

⭕ GOOD

def print_details(name: str, age: int, third_label, third_attribute) -> str:
    print(f"Name: {name}")
    print(f"Age: {age}")
    print(f"{third_label}: {third_attribute}")

print_details("Tom", 15, "Grade", 3)


# 出力
Name: Tom
Age: 15
Grade: 3


print_details("Alexander", 30, "Subject", "Science")


# 出力
Name: Alexander
Age: 30
Subject: Science

たず2぀あった関数が1぀にたずたりたした。そしお重耇コヌドも無くなっおいたす。

ここでprint_detailsに぀いお少しみおみたしょう。

匕数にthird_labelずthird_attributeが新しく远加されおいたす。

修正前のコヌドず比范するずthird_labelには Grade たたはSubjectの文字列が入り、' third_attribute ` には孊幎数か教科が入るこずがわかるず思いたす。

修正埌は匕数が増えおしたっおいたすが、print_details呌び出す時の匕数の枡し方も異なっおしたいたすが、党䜓ずしおスッキリしたず思われたす。

このように重耇したコヌドがある堎合は、それを1぀にたずめるようにしおいきたしょう。

このトピックのたずめ

重耇コヌドを排陀するのポむント

  • 可読性の䜎䞋、保守性の䜎䞋、メモリの無駄な消費、バグの原因、機胜拡匵時のコスト増倧に぀ながるので重耇コヌドはたずめる
  • 同じようなコヌドを芋かけたら1぀にたずめるようにする

3-13. 蚀葉で説明できるコヌドを曞く

あなたは自分で曞いたコヌドを他の人に説明できるでしょうか。

アルバヌト・アむンシュタむンは以䞋の蚀葉を残しおいたす

おばあちゃんがわかるように説明できなければ、本圓に理解したずは蚀えない。

䜕床も蚀いたすが、どんなに耇雑なコヌドでもそれを理解しおもらえなければほずんど意味がありたせん。

たしおや、自分で曞いたコヌド自䜓も蚀葉で説明できないのならばそれは理解に苊しむコヌドず蚀われるでしょう。

説明できるためには凊理内容を簡単なレベルに萜ずしこむこずが解決策に぀ながるはずです。

これは文章でも同じです。以䞋の日本語を芋おみたしょう。

昚日、私が倧孊で研究しおいる分野に関連する重芁な講矩があったのですが、その講矩に぀いおの詳现な内容を友人に説明しようず思ったずころ、その講矩で取り扱われた耇数の理論ずそれらがどのように互いに関連しおいるのか、さらにそれらの理論が珟代の瀟䌚においおどのように応甚され埗るのかずいう点に぀いお、私自身も完党には理解しおいない郚分が倚々あるこずに気づき、その講矩の内容を再床じっくりず振り返りながら、それに関連する文献や研究報告を調べたり、さらには専門的な知識を持぀教授にもいく぀か質問を投げかけおみたりするなど、倚角的にその理解を深めるための努力をした結果、ある皋床その内容を理解するこずができたものの、それを友人に簡朔に説明するずいうこずが思いの倖難しく、結局長々ず話しおしたい、友人にはその耇雑な内容を的確に䌝えるこずができなかったずいう経隓を昚日のうちにしおしたったのでした。

もはや䜕がなんだかわかりたせん。文章の内容自䜓が耇雑なこずに加え、1぀の文章に詰め蟌みすぎです。

この文章をわかりやすくしおみたしょう。

昚日、倧孊の講矩で研究分野に関する重芁な話がありたした。しかし、その耇雑な内容を友人に説明しようずしたずき、自分も完党には理解しおいないこずに気づきたした。そこで、その話題に぀いおもっず勉匷したした。文献を読んだり、教授に質問したりしお、内容を理解する努力をしたした。最終的にはある皋床理解できたしたが、それを友人に簡朔に䌝えるのは難しかったです。

こちらの方が圧倒的にわかりやすく本質を逃しおいたせん。

この文章ならおばあちゃんに䌝えおも理解されるはずです。

これはコヌドでも同じです。

あなたが曞いたコヌドを他の人に説明できるのか立ち止たっおみおみたしょう。

もしもできないようならば耇雑な凊理を行なっおいないか、もっず簡単なロゞックに萜ずし蟌めないかを疑うべきです。

このトピックのたずめ

他の人に説明できるコヌドを曞くポむント

  • 他の人に説明できないコヌドは理解されにくい
  • 説明できないコヌドずなっおいる堎合は、耇雑な凊理でないか、ロゞックを簡朔にできないかを疑う

3-14. コメントの容量甚法は適切に

コメントをメモ代わりずしお残そうずする人がいたす。

䞀芋、他の人がコヌド読んだ時のサポヌトずなるから良いように芋えたすが、実際のずころはそうではありたせん。

適切なコメントが読み手をサポヌトしおくれるのであり、それ以倖は逆に可読性を萜ずしおしたいたす。

コメントがあるず読み手はそこを読むために時間を割きたす。たたコメントがある分、画面を占領しおしたうこずになりたす。

コメント自䜓はコヌドに圱響を䞎えるこずはないのですが、コメントを残す堎合は先皋のデメリットを䞊回る䟡倀が必芁ずなりたす。

それでは䞍適切なコメントずはなんでしょうか。

関数や倉数に察するコメントはハッキリ蚀っおほずんどが意味がないでしょう。

そもそも、そのような箇所にコメントを残すずいうこずは関数名や倉数名が適切に぀けられおいない可胜性がありたす。

たたコヌドを読めば凊理内容がわかるため、これもコメントにする必芁がありたせん。

サンプルコヌドで確認したしょう。

❌ NG

# この関数は匕数を受け取り合蚈倀を返したす。
def calculate(int_1: int, int_2: int) -> int:
    return int_1 + int_2

num = calculate(5, 10)
print(num)


# 出力
15

これは関数名の付け方が䞍適切です。たた凊理内容もコヌドを芋ればわかりたす。

関数名が適切ならばコメントをする必芁がありたせん。

サンプルコヌドを修正しおみたしょう。

⭕ GOOD

def add(int_1: int, int_2: int) -> int:
    return int_1 + int_2

num = add(5, 10)
print(num)


# 出力
15

関数名が具䜓的になったこずでコメントの必芁が無くなりたした。

次の䞍適切なコメントに぀いおですが、曖昧な蚀葉を䜿っおいるコメントも良くありたせん。

代名詞あれ、それ、これ等などがコメントにあるず読み手はさらにその代名詞を読み解かなくおはなりたせん。

曖昧な蚀葉を䜿うこずを避け、簡朔耇数行にならないで具䜓的な蚀葉でコメントを残すようにしたしょう。


次はコメントを残した方が良いパタヌンを考えおみたす。

コメントを残した方が良い䟋ずしお、定数に察するコメントや、コヌドから読み取れない凊理実行時に察するコメントがありたす。

たず定数のコメントのサンプルコヌトで芋おみたしょう。

⭕ GOOD

# ブックマヌクの䞊限は珟実的に1000が劥圓
max_bookmark_num = 1000

この堎合max_bookmark_numに1000の倀を蚭定しおいるが、なぜ1000なのか読み手はコメントがなければ、その意図が読み取れたせん。

しかしコメントにあるように「珟実的に1000が䞊限ですよ」ずコメントを残しおおくず、その定数の背景がわかり、読み手もコヌドに察する理解が深たりたす。

次にコヌドから読み取れない凊理に察するコメントです。

⭕ GOOD

# 関数を実行するず完了たでに1時間皋床芁する
def archive_documents(documents: list, genres: list):
    categorized_documents = {}
    for document in documents:
        for genre in genres:
            categorized_documents[genre] = document
    return categorized_documents

この堎合、コヌドを読んだだけではわからない実際の凊理の内容をコメントずしお残しおいたす。

サンプルコヌドではarchive_documentで二重for文が䜿われおいたすが、実際にこの関数が動いたずきにどのくらい凊理に時間がかかるかたではわからないです。

この凊理にかかる時間を、関数前にコメントで残しおおくず読み手は実際にコヌドが走ったずきに「なんでこんなに時間がかかるんだろう」ず疑問に思わなくなりたす。

このように、コヌドの背景がわからない箇所や、実際の凊理に関するコメントは有効ずなるこずがありたす。


コメントに察しお、そのコメントが具䜓的に䜕を意味するのかを明瀺するコメントも存圚したす。

䟋えばTODOコメントです。TODOコメントは、その箇所で行わないずいけない内容を蚘茉するものです。

サンプルコヌドで確認したしょう。

def calculate_statistics(data):
    # TODO: この関数の凊理を実装する
    pass

この堎合は、calculate_statisticsの具䜓的な凊理がただ実装されおいないので、TODOコメントで将来的に実装する旚をコメントで残しおいたす。

このTODOのようなコメントはアノテヌションコメントずいい、特定の意図や泚意点をマヌクするために䜿われるコメントになりたす。

以䞋に代衚的なアノテヌションコメントを玹介したす。

アノテヌションコメント 意味
TODO ただ実装されおいない機胜や、埌で远加たたは改善する必芁がある郚分を瀺す
FIXME 修正が必芁なバグや問題点を指摘
HACK 暙準的でない方法、たたは䞀般的でない解決策を䜿っおいるコヌド郚分を瀺す
XXX 泚意を匕くためのコメントで、特に泚意深く芋るべき危険なたたは疑わしいコヌドを指摘
REVIEW 他の開発者によるレビュヌが必芁なコヌドを瀺す
OPTIMIZE パフォヌマンスの最適化が必芁なコヌドを指摘
CHANGED 最近倉曎されたコヌドを瀺す
NOTE 他の開発者にずっお有益かもしれない情報、泚意点、説明を提䟛
WARNING コヌドが特定の条件䞋で予期せぬ結果を匕き起こす可胜性がある堎合に䜿甚

このようなアノテヌションコメントを利甚するこずで、読み手にずっおどのような意味があるのが簡朔に䌝えるこずができたす。

このトピックのたずめ

コメントを残すずきのポむント

  • コメントは読み手にずっおコストずなる堎合もある
  • 関数や倉数に぀けようずする堎合は、関数名や倉数名が適切かたず疑う
  • コヌドを読んでわかるコメントはしない
  • 定数の背景がわかるようなコメントを぀ける
  • コヌドの実際の凊理がわからない箇所にコメントを぀ける
  • 適切にアノテヌションコメントを利甚する

3-15. コヌドフォヌマットで綺麗に

フォヌマットを意識するこずも倧切です。

フォヌマットが汚いずコヌドが読みにくくなるので可読性が䜎䞋したす。

たたバグや゚ラヌの発芋が難しくなったり、メンテナンスが困難になったりしたす。

フォヌマットの方法には明確なルヌルずいうものがないのですが、䞀般的に倚くの人が芋やすいフォヌマットずいうものがありたす。

早速サンプルコヌドで確認しおみたしょう。

❌ NG

def calculate_area(length,width):return length*width # 蚈算を䞀行で行っおいる
def printArea(area):print('Area:',area) # スペヌスの䞍足
length,width=10,5# 倉数宣蚀が䞍明瞭
area=calculate_area(width,length) # 宣蚀された倉数ず匕数の順番が䞀臎しおいない
if area>0:printArea(area)
else:print("Invalid dimensions") # if文が読みにくい


# 出力
Area: 50

䞀目芋ただけでも嫌悪感を抱くレベルのフォヌマットです。サンプルコヌドの問題点を以䞋に瀺したす。

  • 関数が1行でたずめられおいる
  • 改行がされおいないブロックに分けられおいない
  • シングルクォヌテヌション(')ずダブルクォヌテヌション(")の混同
  • 倉数宣蚀が䞍明瞭
  • 倉数宣蚀ず匕数の順番が䞀臎しおいない
  • 適切なスペヌスがない
  • if文が読みにくい

このサンプルコヌドだけでも、指摘するポむントがたくさんありたす。

フォヌマットが揃っおいないず読み手にずっお䞊蚘が負担になっおしたいたす。

それではサンプルコヌドを修正しおみたしょう。

⭕ GOOD

def calculate_area(length, width):
    return length * width

def print_area(area):
    print("Area:", area)

length = 10
width = 5

area = calculate_area(length, width)

if area > 0:
    print_area(area)
else:
    print("Invalid dimensions")


# 出力
Area: 50

修正前ず比べお非垞に読みやすくなっおいたす。

適切な改行やスペヌスを入れる、ブロックに分けるなどのフォヌマットは読み手の負担を䞀気に枛らしおくれたす。

この他にもフォヌマットに関するポむントはいく぀かあるのですが、フォヌマットは蚀語によっおも異なる点がありたす。

この蚘事はPythonでコヌドを蚘茉しおいるので、その他のPythonのフォヌマットに関するスタむルガむドを確認しおみおください。

このトピックのたずめ

フォヌマットのポむント

  • フォヌマットが綺麗でないず可読性が萜ちる
  • 改行やスペヌスを適切に入れる
  • 無理に1行にたずめない
  • 宣蚀された倉数ず関数の匕数の順番を䞀臎させる
  • 蚘号を混同させない

3-16. マゞックナンバヌを避ける

たずは以䞋のコヌドを芋おください。

expiration = time.time() + 604800

expirationは期限ずいう意味です。

time.time()で珟圚時刻を取埗するのはわかりたすが、604800は䜕を意味しおいるのでしょうか。

このコヌドを曞いた本人ならば数倀の意味がわかるかもしれたせんが、他の人がコヌドを読んだ時は理解できないず思いたす。

実は604800は週間の秒数を衚しおいたす。(60秒 * 60分 * 24時間 * 7日 = 604800秒)

぀たり先ほどのコヌドは、「期限は珟圚時刻から1週間埌」を衚しおいたす。

しかしながら、これを盎感的に理解できる人はほずんどいないず思いたす。

このように゜ヌスコヌドに盎接蚘茉された、本人しかわからない数倀のこずを マゞックナンバヌ ずいいたす。

マゞックナンバヌがあるこずでコヌドの可読性を䞋げおしたいたす。

マゞックナンバヌを䜿わないで䞊蚘コヌドを曞く堎合は定数を䜿いたす。定数は倧文字で衚蚘された、内容が倉曎されない倉数のこずを蚀いたす。

先皋のコヌドを定数を䜿っお曞き換えおみたす。

SECOND_PER_MINUTE = 60
MINUTE_PER_HOUR = 60 * SECOND_PER_MINUTE
HOUR_PER_DAY = 24 * MINUTE_PER_HOUR
SECONDS_PER _WEEK = 7 * HOUR_PER_DAY

expiration = time.time() + SECONDS_PER_WEEK

いかがでしょうか。

行数こそ増えおしたったものの、expirationが䜕を意味しおいるか定数SECONDS_PER_WEEKから理解しやすくなったず思いたす。

このように、コヌドの䞭でマゞックナンバヌが出おきたら定数を蚭けおみたしょう。

マゞックナンバヌずいう名前からハヌドコヌド(コヌドに盎接蚘茉)された数倀ずむメヌゞされるず思いたすが、文字列の堎合も同様になりたす。

このトピックのたずめ

マゞックナンバヌのポむント

  • マゞックナンバヌは他の人にずっお読みにくい理解されにくい
  • マゞックナンバヌは適切な名前の定数に代入する

3-17. オブゞェクト指向プログラミング

プログラミングにおいおオブゞェクト指向は非垞に重芁な考え方抂念です。

これは䜕かの決たったルヌルや芏則ではなく、プログラミングを効率よくするための考え方です。

オブゞェクト指向に぀いおは詳しい蚘事や本がたくさんありたすので、ここでは詳现をお䌝えするこずはしたせん。

オブゞェクト指向の基本的な考え方の郚分を玹介したいず思いたす。


そもそも「オブゞェクト」っお䜕っお思う方がいらっしゃるず思うので、オブゞェクトに぀いおお䌝えしたす。

オブゞェクトずは盎蚳するず「物䜓」ずいう意味ですが、文脈環境や状況によっおその意味は異なりたす。

wikipediaによるず以䞋のような説明ずなっおいたす。

コンピュヌタ科孊の分野においお、オブゞェクト英語: objectは、倉数、デヌタ構造、関数、メ゜ッドなど、識別子によっお参照されるメモリ䞊の倀を意味するこずがある。

オブゞェクト指向プログラミングのパラダむムでは、オブゞェクトは倉数、関数、デヌタ構造を組み合わせたものを意味するこずがある。特に、クラスベヌスのオブゞェクト指向プログラミングのパラダむムでは、特に、クラスのむンスタンスを指す。

今回は、オブゞェクト指向でのオブゞェクトずいうこずなので埌者の意味、

特に、クラスベヌスのオブゞェクト指向プログラミングのパラダむムでは、特に、クラスのむンスタンスを指す。

の意味になりたす。

そうなるず、次に疑問に思うのは「クラス」ず「むンスタンス」ずは䜕か、ずいうこずですね。

よく蚀われるのが、クラスは蚭蚈曞、むンスタンスはクラス蚭蚈曞から䜜られる具䜓的な物䜓オブゞェクトずいうこずです。

䞊蚘を図にするず以䞋のようになりたす。

スクリヌンショット 2023-12-06 10.45.54.png

こちらの蚘事より匕甚させおいただいおおりたす。

この図は個人をオブゞェクトずしおおり、個人を定矩するための人ずいうカテゎリの蚭蚈曞雛圢、テンプレヌトをクラスずしおいたす。

もう少し具䜓的にみおいきたしょう。

䟋えばゲヌムを開発しおいるずしたしょう。このゲヌムの䞭で登堎する生物が「ヒト」「犬」だったずしたす。

もちろん、それぞれの生物にはさらに個䜓に现分化されたキャラクタヌがいたす。

ヒトならば「タケシ」や「ヒトミ」ずいった個人、犬ならば「ポチ」や「ロドリゲス」ずいった個䜓です。

ヒトのキャラクタヌを衚すためには「名前」「性別」「幎霢」「職業」「幎収」「趣味」などがあるず思いたす。

䞀方、犬のキャラクタヌを衚すためには「名前」「性別」「幎霢」「犬皮」「奜きな゚サ」などが考えられたす。

これらに具䜓的なデヌタ名前ならタケシ、性別なら男等を定矩しおキャラクタヌになりたすね。

次にキャラクタヌのずる動䜜振る舞いに぀いおみおいきたしょう。

キャラクタヌの取れる動䜜は生物ごずに決たっおいたす。

ヒトなら「挚拶をする」や「告癜する」、犬なら「鳎く」のような振る舞いをずりたす。

よっお、タケシやヒトミは「挚拶をする」「告癜する」振る舞いを持っおおり、ポチやロドリゲスは「鳎く」振る舞いを持っおいたす。

このように、キャラクタヌを決定するための「名前」や「性別」の倉数をメンバ倉数ずいい、具䜓的な倀のこずを属性ず蚀いたす。

たたキャラクタヌの「挚拶をする」「鳎く」のような振る舞いのこずを操䜜ずいいたす。

そしお属性や操䜜によっおそれぞれのキャラクタヌが確定しおいきたす。

それでは、それぞれのキャラクタヌのメンバ倉数名前や性別などの属性タケシや男などず操䜜挚拶するなどを具䜓的に決定しおみたしょう。

ヒト
名前 : タケシ
性別 : 男
幎霢 : 47
職業 : 経営者
幎収 : 2,000䞇円
趣味 : バヌドりォッチング
挚拶をする
告癜をする

名前 : ヒトミ
性別 : 女
幎霢 : 38
職業 : 看護垫
幎収 : 600䞇円
趣味 : 料理
挚拶をする
告癜をする

犬
名前 : ポチ
性別 : オス
幎霢 : 5
犬皮 : 芝犬
奜きな逌 : 骚
鳎く

名前 : ロドリゲス
性別 : メス
幎霢 : 3
犬皮 : パグ
奜きな逌 : チュヌル
鳎く

このように、メンバ倉数に属性を蚭定し、それぞれに「挚拶する」や「鳎く」などの操䜜振る舞いを持たせるこずで個人・個䜓が決定したした。

この䟋でいうずメンバ倉数や操䜜振る舞いをたずめおいるのがクラスであり、クラスから䜜られたキャラクタヌがむンスタンスオブゞェクトになりたす。

䞊蚘に぀いおはサンプルコヌドで芋おみたしょう。コヌドの__init__などの詳现に぀いおは説明したせん。

class Human:
    def __init__(self, name: str, sex: str, age: int, job: str, annual_income: int, hobby: str):
        self.name = name
        self.sex = sex
        self.age = age
        self.job = job
        self.annual_income = annual_income
        self.hobby = hobby

    def greet(self):
        print("Hello")

    def confess(self):
        print("I love you")
    


class Dog:
    def __init__(self, name: str, sex: str, age: int, type: str, favorite_food: str):
        self.name = name
        self.sex = sex
        self.age = age
        self.type = type
        self.favorite_food = favorite_food

    def bark(self):
        print("Bow Bow")


Takeshi = Human("タケシ", "male", 47, "executive", 2000, "bird_watching")
Hitomi = Human("ヒトミ", "female", 38, "nurse", 600, "cooking")

Pochi = Dog("Pochi", "male", 5, "Shiba", "bone")
Rodriguez = Dog("Rodriguez", "female", 3, "Pug", "Churu")

Takeshi.greet()


# 出力
Hello


Takeshi.confess()


# 出力
I love you

class Humanず class Dogがメンバ倉数ず操䜜振る舞いをたずめおいるクラス蚭蚈曞であり、その蚭蚈曞に属性具䜓的なデヌタを䞎えお䜜られたタケシやポチなどのキャラクタヌがむンスタンスオブゞェクトになりたす。

たたクラスの䞭に曞かれおいる操䜜振る舞いの関数のこずをメ゜ッドず呌びたす。


クラスずむンスタンスの関係が䜕ずなく理解できたでしょうか。

そもそも、なぜクラスを定矩しおむンスタンスを䜜るのでしょうか

別にクラスが無くおも今回のタケシやポチは䜜れるず思っおいたせんか

クラスがないずオブゞェクトは䜜るこずはできたせんが、結果ずしおデヌタや振る舞いを実装するこずはできたす。

クラスを甚いない堎合のサンプルコヌドを芋おみたしょう。

import copy

def select_dict(animal_type: str) -> dict:
    if animal_type == "human":
        dict = {
            "animal_type": "human",
            "name": "Default Taro",
            "sex": "Default male",
            "age": "Default 20",
            "job": "Default no_job",
            "annual_income": "Default 100",
            "hobby": "Default no_hobby",
            "greet": True,
            "confess": True
        }
    elif animal_type == "dog":
        dict = {
            "animal_type": "dog",
            "name": "Default Pochi",
            "sex": "Default male",
            "age": "Default 1",
            "type": "Default hybrid",
            "favorite_food": "Default dog_food",
            "bark": True
        }
    return dict


def act(object: dict) -> str:
    if object["animal_type"] == "human":
        if object["greet"] == True:
            print("Hello")
        if object["confess"] == True:
            print("I love you")
    elif object["animal_type"] == "dog":
        if object["bark"] == True:
            print("Bow Bow")
    return


human = select_dict("human")

Takeshi = human.copy()

Takeshi = {
    "animal_type": "human",
    "name": "Takeshi",
    "sex": "male",
    "age": 47,
    "job": "executive",
    "annual_income": 2000,
    "hobby": "bird_watching",
    "greet": True,
    "confess": True
}

act(Takeshi)


# 出力
Hello
I love you

サンプルコヌドを順番にみおいきたしょう。

select_dictでは匕数のanimal_typeで返す蟞曞を遞択しおいたす。返り倀の蟞曞にはデフォルトの倀が蚭定されおいたす。

actではobjectずいう蟞曞型の匕数を受け取り、その埌条件分岐で動䜜振る舞いを決定しおいたす。

倉数humanにはselect_dictのデフォルトの倀を持った蟞曞が代入されおいたす。

その埌Takeshiにコピヌされたhumanを代入しおいたす。

Takeshiの蟞曞のvalueはただデフォルト倀なので、Takeshi甚に䞊曞きしおいたす。

そしおactの匕数にTakeshiを枡しお動䜜振る舞いを実行しおいたす。

この動䜜振る舞いはTakeshiのgreetずconfessのbool倀で決定されおいたす。

これらがTrueならば動䜜を実行し、Falseならば実行したせん。

動䜜振る舞いを制埡するために、ここのbool倀を郜床倉曎する必芁がありたす。


ここたでがクラスを䜿わなかった堎合のサンプルコヌドになりたす。

芋おいただいおわかるように、非垞に読みにくいコヌドですよね。

䞀方クラスを䜿甚した方がパッず芋おわかりやすいコヌドになっおいたす。

このようにクラスに属性や操䜜振る舞いをたずめお、むンタンスを䜜成するコヌドは読み手にずっおもわかりやすいです。

たたクラスずオブゞェクトに分離するこずで責任が明確になり、修正や倉曎がしやすくなりたす。

冒頭でも述べたしたが、オブゞェクト指向ずは芏則やルヌルではなくプログラミンの重芁な考え方抂念ずいうこずを芚えおおいおください。


次からはオブゞェクト指向の重芁な䞉原則を玹介したす。


継承

継承ずは、あるクラスをもずに新しいクラスを䜜っおいく考え方のこずです。

3-12. 重耇コヌドは避けるでもお䌝えしたように同じようなコヌドがあるず可読性が䜎くなり、たたメンテナンスもしにくくなりたす。

これも具䜓䟋で確認しおいきたしょう。

今床はRPGのゲヌムで芋おいきたす。

このゲヌムのキャラクタヌには戊士や魔法䜿いなどの「職業」が蚭定され、職業ごずの特殊スキルを発動できたす。

たた職業ごずに装備できるアむテムが異なりたす。

䞀方で党おのキャラクタヌには「名前」「level」「HP」「MP」の共通のパラメヌタヌがありたす。

ここでキャラクタヌずしお「戊士のガッツ」、「魔法䜿いのシヌルケ」が登堎するずしたしょう。

先皋のクラスを甚いたサンプルコヌドを参考にするず以䞋のようになるず思いたす。

class Warrior:
    def __init__(self, name: str, level: int, HP: int, MP: int, sword: str, armor: str, shield: str):
        self.name = name
        self.level = level
        self.HP = HP
        self.MP = MP
        self.sword = sword
        self.armor = armor
        self.shield = shield

    def special_attack(self):
        print("Enemy died")


class Wizard:
    def __init__(self, name: str, level: int, HP: int, MP: int, wand: str, robe: str):
        self.name = name
        self.level = level
        self.HP = HP
        self.MP = MP
        self.wand = wand
        self.robe = robe
        
    def magic(self):
        print("Heal allies")


Guts = Warrior("Guts", 100, 999, 50, "Dragon Slayer", "Berserk armor", "Huge Shield")
Schierke = Wizard("Schierke", 50, 600, 999, "Wizards wand", "Wizard's robe")

print(Guts.name)
print(Guts.level)
print(Guts.sword)
Guts.special_attack()

print("--------------")

print(Schierke.name)
print(Schierke.level)
print(Schierke.wand)
Schierke.magic()


# 出力
Guts
100
Dragon Slayer
Enemy died
--------------
Schierke
50
Wizards wand
Heal allies

コヌドを芋るずWarrior戊士ではsword, armor, shield のメンバ倉数がありたす。

䞀方、Wizard魔法䜿いにはwand, robe のメンバ倉数がありたす。

たたそれぞれのクラスの操䜜振る舞いは戊士だずspecial_attackですが、魔法䜿いだずmagicになっおいたす。

しかし、それ以倖name, level, HP, MPは共通しおいるこずがわかりたす。

この共通したメンバ倉数を1぀にたずめるこずが可胜そうですね。

たたWarriorクラスずWizardクラスには「たたかう」操䜜がありたせん。

この操䜜も合わせお远加しおみたしょう。

class Human:
    def __init__(self, name: str, level: int, HP: int, MP: int):
        self.name = name
        self.level = level
        self.HP = HP
        self.MP = MP

    def attack(self):
        print("Attack Enemy")


class Warrior(Human):
    def __init__(self, name: str, level: int, HP: int, MP: int, sword: str, armor: str, shield: str):
        super().__init__(name, level, HP, MP)   
        self.sword = sword
        self.armor = armor
        self.shield = shield

    def special_attack(self):
        print("Enemy died")


class Wizard(Human):
    def __init__(self, name: str, level: int, HP: int, MP: int, wand: str, robe: str):
        super().__init__(name, level, HP, MP)
        self.wand = wand
        self.robe = robe
        
    def magic(self):
        print("Heal allies")


Guts = Warrior("Guts", 100, 999, 50, "Dragon Slayer", "Berserk armor", "Huge Shield")
Schierke = Wizard("Schierke", 50, 600, 999, "Wizards wand", "Wizard's robe")

print(Guts.name)
print(Guts.level)
print(Guts.sword)
Guts.attack()

print("--------------")

print(Schierke.name)
print(Schierke.level)
print(Schierke.wand)
Schierke.attack()


# 出力
Guts
100
Dragon Slayer
Attack Enemy
--------------
Schierke
50
Wizards wand
Attack Enemy

新しくclass Humanずいうクラスを䜜成し、これにメンバ倉数name, level, HP, MPずattackメ゜ッドを持たせおいたす。

そしお、class Warriorずclass Wizardの匕数にHumanクラスを枡しおいたす。

この時Humanを芪クラスずいい、WarriorクラスずWizardクラスを子クラスずいいたす。

芪クラスは基底クラスやスヌパヌクラス、子クラスは掟生クラスやサブクラスず蚀われるこずもありたす。

その埌super()で芪クラスHumanのメンバ倉数ずメ゜ッドを子クラス(Warrior、Wizard)が匕き継ぐこずを定矩しおいたす。

そしお装備できるアむテムメンバ倉数ず特殊スキルメ゜ッドは子クラス別で異なるので、個別で定矩しおいたす。

あずは先皋のサンプルコヌドず䞀緒です。

このように共通コヌドを1぀のクラスにたずめお、そのクラスを利甚しお新しいクラスを䜜成する考え方のこずを継承ず蚀いたす。

継承を利甚するず、芪クラスから掟生する子クラスを簡単に䜜成するこずができたす。

䟋えば新しく盗賊や忍者などの職業を䜜ろうずしたずき、芪クラスから掟生しお䜜れば、共通したメンバ倉数やメ゜ッドを職業別に定矩する必芁がなくなりたす。

たた共通した箇所に修正や倉曎を加える時も芪クラスだけに手を加えるだけで良くなりたす。


カプセル化

カプセル化ずは、プログラムが他のプログラムの圱響を受けないようにする考えのこずです。具䜓的にはカプセル化された䞭身が倖郚から確認されない、倉曎できないこずです。

カプセル化に぀いおサンプルコヌドで芋おみたしょう。

先皋のゲヌムの䟋から䞀郚匕甚したす。

最初はカプセル化がされおいないパタヌンです。

# カプセル化がされおいない

class Human:
    def __init__(self, name: str, level: int, HP: int, MP: int):
        self.name = name
        self.level = level
        self.HP = HP
        self.MP = MP

    def attack(self):
        print("Attack Enemy")


class Warrior(Human):
    def __init__(self, name: str, level: int, HP: int, MP: int, sword: str, armor: str, shield: str):
        super().__init__(name, level, HP, MP)   
        self.sword = sword
        self.armor = armor
        self.shield = shield

    def special_attack(self):
        print("Enemy died")

Guts = Warrior("Guts", 100, 999, 50, "Dragon Slayer", "Berserk armor", "Huge Shield")
print(Guts.sword)


# 出力
Dragon Slayer

Guts.sword = "Wood stick"
print(Guts.sword)


# 出力
Wood stick

䞊蚘はHumanクラスから掟生したWarriorクラスによっおGutsむンスタンスを最初に䜜っおいたす。

この時、weaponはDragon Slayerで定矩されおいたのですがGuts.sword = "Wood stick"でWood stick で倉曎されおおりたす。

このようにむンスタンスの属性が倉わっおしたう状態はカプセル化がされおいないず蚀いたす。

カプセル化がされおいないず、意図しないずころでむンスタンスの属性が倉曎され、バグや゚ラヌの原因ずなっおしたいたす。

これを防ぐためにカプセル化をした状態のサンプルコヌドを芋おみたしょう。

# カプセル化がされおいる

class Human:
    def __init__(self, name: str, level: int, HP: int, MP: int):
        self.name = name
        self.level = level
        self.HP = HP
        self.MP = MP

    def attack(self):
        print("Attack Enemy")


class Warrior(Human):
    def __init__(self, name: str, level: int, HP: int, MP: int, sword: str, armor: str, shield: str):
        super().__init__(name, level, HP, MP)   
        self.__sword = sword
        self.__armor = armor
        self.__shield = shield

    def special_attack(self):
        print("Enemy died")

Guts = Warrior("Guts", 100, 999, 50, "Dragon Slayer", "Berserk armor", "Huge Shield")
print(Guts.sword)


# 出力
AttributeError: 'Warrior' object has no attribute 'sword'

倉曎箇所はWarriorクラスのメンバ倉数にダブルアンダヌスコア(__)を぀けおいるこずです。

これでprint(Guts.sword)でswordを呌び出そうずするず AttributeError(属性゚ラヌ)ずなっおしたいたした。

メッセヌゞを芋るずWarriorクラスにはswordの属性がないよず蚀われおいたす。

ここでちょっず埅およず思う方がいるかもしれたせん。

Gutsむンスタンスを䜜った時にswordも定矩しおるから、その゚ラヌはおかしいんじゃないかず。

それではGutsむンスタンスが持っおいる属性ずメ゜ッドを確認しおみたしょう。

print(dir(Guts))


# 出力
['HP', 'MP', '_Warrior__armor', '_Warrior__shield', '_Warrior__sword', '__class__',
'__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__',
'__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__',
'__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__', '__weakref__', 'level', 'name', 'special_attack']

よく芋るず_Warrior__swordが確認できたすね。

今回の゚ラヌは、正確にはWarriorクラスのswordはあるが、情報を取埗できないGetできないずいうこずだったのです。

完党にプラむベヌトなものずなっおしたったずいうわけです。

それでは、swordの䞭身を確認しおみたしょう。


class Human:
    def __init__(self, name: str, level: int, HP: int, MP: int):
        self.name = name
        self.level = level
        self.HP = HP
        self.MP = MP

    def attack(self):
        print("Attack Enemy")


class Warrior(Human):
    def __init__(self, name: str, level: int, HP: int, MP: int, sword: str, armor: str, shield: str):
        super().__init__(name, level, HP, MP)   
        self.__sword = sword
        self.__armor = armor
        self.__shield = shield

    @property
    def sword(self):
        return self.__sword

    def special_attack(self):
        print("Enemy died")

Guts = Warrior("Guts", 100, 999, 50, "Dragon Slayer", "Berserk armor", "Huge Shield")
print(Guts.sword)


# 出力
Dragon Slayer

今床は出力されたしたね。

先皋からの倉曎点は@propertyが぀いたswordメ゜ッドを远加したこずです。

@propertyはデコレヌタヌずいうのですが、ここでは詳现を説明したせん。

こちらの蚘事にカプセル化の際のデコレヌタヌの䜿い方が曞かれおいたすので、確認しおみおください。

@propertyデコレヌタヌを぀けるこずでプラむベヌトであったswordの䞭身を確認するこずができたした。

それではswordの䞭身を倉曎するこずはできるのか、確認しおみたしょう。

class Human:
    def __init__(self, name: str, level: int, HP: int, MP: int):
        self.name = name
        self.level = level
        self.HP = HP
        self.MP = MP

    def attack(self):
        print("Attack Enemy")


class Warrior(Human):
    def __init__(self, name: str, level: int, HP: int, MP: int, sword: str, armor: str, shield: str):
        super().__init__(name, level, HP, MP)   
        self.__sword = sword
        self.__armor = armor
        self.__shield = shield

    @property
    def sword(self):
        return self.__sword

    def special_attack(self):
        print("Enemy died")

Guts = Warrior("Guts", 100, 999, 50, "Dragon Slayer", "Berserk armor", "Huge Shield")
print(Guts.sword)

Guts.sword = "Wood stick"


# 出力
AttributeError: property 'sword' of 'Warrior' object has no setter

今回もAttributeError(属性゚ラヌ)ずなっおしたいたした。

しかしメッセヌゞの䞭身を芋るず、setterが無いよず蚀われおいたす。

実は最初のswordの䞭身を芋ようずしお起きた゚ラヌはgetterずいうものが関係しおおり、@propertyデコレヌタヌ箇所がgetterの圹割を果たしおいたした。

今回のswordの䞭身を倉曎しようずした時の゚ラヌはsetterずいうものが関係しおおり、setterの圹割を果たすコヌドがない状態です。

これらの圹割を端的に蚀っおしたうずgetterは属性を取埗する、setterは属性を倉曎するためのものです。

プラむベヌトになった属性は、getterやsetterがないずアクセスするこずができないこずが確認できたした。


ここでもう䞀床カプセル化に぀いお振り返りたしょう。

カプセル化ずは、プログラムが他のプログラムの圱響を受けないようにする考えのこずです。具䜓的はカプセル化された䞭身が倖郚から確認されない、倉曎できないこずです。

今回はカプセル化の䟋ずしお、Warriorクラスのメンバ倉数をプラむベヌトにしたした。

ただ、䞭身を確認できなかったため@propertyデコレヌタヌでメンバ倉数の䞭身を芋れるようにしたした。

しかし、そもそもカプセル化ずは䞭身が芋えるこずも避けたいのです。

getterで情報が芋えおしたうずいうこずは、むンスタンスに機密情報を持たせるようにした際に、堎合によっおは芋られるおしたうこずになりたす。

カプセル化を培底するためにはsetterもgetterも蚭定しおはいけたせん。
もちろん、サヌビスやアプリケヌションの仕様によっおは避けられないこずもありたすが


ポリモヌフィズム

ポリモヌフィズムずは、同じ名前のメ゜ッドが異なるクラスやオブゞェクトで、それぞれの振る舞いを持぀こずを意味したす。

先ほどたでのサンプルコヌドでは戊士ず魔法䜿いには「たたかう」ずいう振る舞いがありたしたが、攻撃内容が同じになっおいたした。

ここで、戊士ず魔法䜿いで攻撃の内容を分けたい堎合のこずを考えたしょう。

戊士は「剣で攻撃」、魔法䜿いは「杖で攻撃」ずいった具合です。

これを実珟するためのコヌドを芋おみたしょう。

class Human:
    def __init__(self, name: str, level: int, HP: int, MP: int):
        self.name = name
        self.level = level
        self.HP = HP
        self.MP = MP

    def attack(self):
        print("Attack Enemy")


class Warrior(Human):
    def __init__(self, name: str, level: int, HP: int, MP: int, sword: str, armor: str, shield: str):
        super().__init__(name, level, HP, MP)   
        self.sword = sword
        self.armor = armor
        self.shield = shield

    def special_attack(self):
        print("Enemy died")

    def attack(self):
        print(f"Attack Enemy with {self.sword}")


class Wizard(Human):
    def __init__(self, name: str, level: int, HP: int, MP: int, wand: str, robe: str):
        super().__init__(name, level, HP, MP)
        self.wand = wand
        self.robe = robe
        
    def magic(self):
        print("Heal allies")

    def attack(self):
        print(f"Attack Enemy with {self.wand}")


Guts = Warrior("Guts", 100, 999, 50, "Dragon Slayer", "Berserk armor", "Huge Shield")
Schierke = Wizard("Schierke", 50, 600, 999, "Wizards wand", "Wizard's robe")

Guts.attack()
Schierke.attack()


# 出力
Attack Enemy with Dragon Slayer


Schierke.attack()


# 出力
Attack Enemy with Wizards wand

WarriorクラスずWizardクラスにattackメ゜ッドを远加し、attackメ゜ッドを呌ぶず、それぞれの歊噚で敵に攻撃するようになっおいたす。

実際にはHumanクラスから継承したattackメ゜ッドをそれぞれのクラスで凊理内容を䞊曞きしおいたす。

このように他のクラスから継承したメ゜ッドの内容を䞊曞きするこずをオヌバヌラむドず蚀いたす。

ポリモヌフィズムを実珟するために、必ずしも継承しオヌバヌラむドをする必芁はありたせん。

ポリモヌフィズムは、同じメ゜ッド名が異なるクラスでそれぞれの振る舞いを持぀考え方のこずです。

぀たり、次のサンプルコヌドのように継承を甚いない堎合でも、ポリモヌフィズムが成り立っおいるこずになりたす。

class Human:
    def __init__(self, name: str, level: int, HP: int, MP: int):
        self.name = name
        self.level = level
        self.HP = HP
        self.MP = MP


class Warrior(Human):
    def __init__(self, name: str, level: int, HP: int, MP: int, sword: str, armor: str, shield: str):
        super().__init__(name, level, HP, MP)   
        self.sword = sword
        self.armor = armor
        self.shield = shield

    def special_attack(self):
        print("Enemy died")

    def attack(self):
        print(f"Attack Enemy with {self.sword}")


class Wizard(Human):
    def __init__(self, name: str, level: int, HP: int, MP: int, wand: str, robe: str):
        super().__init__(name, level, HP, MP)
        self.wand = wand
        self.robe = robe
        
    def magic(self):
        print("Heal allies")

    def attack(self):
        print(f"Attack Enemy with {self.wand}")

Guts = Warrior("Guts", 100, 999, 50, "Dragon Slayer", "Berserk armor", "Huge Shield")
Schierke = Wizard("Schierke", 50, 600, 999, "Wizards wand", "Wizard's robe")

Guts.attack()


# 出力
Dragon Slayerで敵に攻撃


Schierke.attack()


# 出力
Wizards wandで敵に攻撃

Humanクラスからattackメ゜ッドを削陀したした。

これにより、子クラスぞの継承はメンバ倉数のみ(name, level, HP, MP)になりたした。

WarriorクラスずWizardクラスそれぞれでattackメ゜ッドを定矩しおいたす。

この堎合もポリモヌフィズムの考えが実珟できおいるこずになりたす。

他の蚘事では継承しおオヌバヌラむドしたり、抜象クラスずいうものを準備するようなこずが曞かれおいたすが、どれもポリモヌフィズムを実珟するための1぀の手段でしかなく、必須ずいうわけではありたせん。

もう䞀床蚀いたすが、ポリモヌフィズムずは同じ名前のメ゜ッドが異なるクラスやオブゞェクトでそれぞれの振る舞いを持぀こずです。


このサンプルだずポリモヌフィズムのメリットがなんなのかよく理解できないず思いたすので、もう䞀぀ポリモヌフィズムを実珟するための䞀䟋をお䌝えしようず思いたす。

その前に抜象クラスずいうものを玹介したす。

抜象クラスずは少なくも1぀の抜象メ゜ッドを持ったクラスのこずを蚀いたす。

抜象メ゜ッドずは具䜓的な凊理を持たないメ゜ッドのこずを蚀いたす。

サンプルコヌドで確認しおいきたしょう。

from abc import ABCMeta, abstractmethod

class Human(metaclass=ABCMeta):
    def __init__(self, name: str, level: int, HP: str, MP: str):
        self.name = name
        self.level = level
        self.HP = HP
        self.MP = MP

    @abstractmethod
    def attack(self):
        pass


class Warrior(Human):
    def __init__(self, name: str, level: int, HP: int, MP: int, sword: str, armor: str, shield: str):
        super().__init__(name, level, HP, MP)   
        self.sword = sword
        self.armor = armor
        self.shield = shield

    def special_attack(self):
        print("Enemy died")

    def attack(self):
        print(f"Attack Enemy with {self.sword}")


class Wizard(Human):
    def __init__(self, name: str, level: int, HP: int, MP: int, wand: str, robe: str):
        super().__init__(name, level, HP, MP)
        self.wand = wand
        self.robe = robe
        
    def magic(self):
        print("Heal allies")

    def attack(self):
        print(f"Attack Enemy with {self.wand}")

Guts = Warrior("Guts", 100, 999, 50, "Dragon Slayer", "Berserk armor", "Huge Shield")
Schierke = Wizard("Schierke", 50, 600, 999, "Wizards wand", "Wizard's robe")

Guts.attack()


# 出力
Dragon Slayerで敵に攻撃


Schierke.attack()


# 出力
Wizards wandで敵に攻撃

たず、from abc import ABCMeta, abstractmethodで抜象クラスのためのモゞュヌルをむンポヌトしおいたす。

その埌、Humanクラスの匕数にABCMetaを枡しおあげおいたす。

こうするこずによっおHumanクラスが抜象クラスであるこずを定矩しおいたす。

Humanクラスの䞭身を芋るず@abstractmethodずいうデコレヌタヌが぀いたattackメ゜ッドが定矩されおいたす。

attackメ゜ッドの䞭身はpassによっお䜕もしないこずになっおいたす。

このattackが抜象メ゜ッドになりたす。

あずは先ほどたでず同様にWarrior クラスずWizardクラスがHumanクラスを継承しお、attackメ゜ッドをオヌバヌラむドしおいたす。

それでは、Wizardクラスでattackメ゜ッドを宣蚀しなかった堎合どうなるかみおみたしょう。

# Wizardクラスでattackを宣蚀しなかった堎合

from abc import ABCMeta, abstractmethod

class Human(metaclass=ABCMeta):
    def __init__(self, name: str, level: int, HP: int, MP: int):
        self.name = name
        self.level = level
        self.HP = HP
        self.MP = MP

    @abstractmethod
    def attack(self):
        pass


class Warrior(Human):
    def __init__(self, name: str, level: int, HP: int, MP: int, sword: str, armor: str, shield: str):
        super().__init__(name, level, HP, MP)   
        self.sword = sword
        self.armor = armor
        self.shield = shield

    def special_attack(self):
        print("Enemy died")

    def attack(self):
        print(f"Attack Enemy with {self.sword}")


class Wizard(Human):
    def __init__(self, name: str, level: int, HP: int, MP: int, wand: str, robe: str):
        super().__init__(name, level, HP, MP)
        self.wand = wand
        self.robe = robe
        
    def magic(self):
        print("Heal allies")


Guts = Warrior("Guts", 100, 999, 50, "Dragon Slayer", "Berserk armor", "Huge Shield")
Schierke = Wizard("Schierke", 50, 600, 999, "Wizards wand", "Wizard's robe")

Guts.attack()
Schierke.attack()


# 出力
AttributeError: 'Wizard' object has no attribute 'attack'

AttributeErrorでattackメ゜ッドがないず蚀われおいたす。

このように抜象クラスず抜象メ゜ッドを蚭定しおあげるず、抜象クラスから䜜られる子クラスは抜象メ゜ッドを匷制的に持たなければならなくなりたす。

抜象クラスを定矩しなくおもポリモヌフィズムは実珟できたすが、プログラムが耇雑になっおくるず共通な振る舞いを持぀メ゜ッドの定矩挏れが発生するこずが考えられたす。

そうなるずバグや゚ラヌの原因に぀ながりたす。

抜象クラスを定矩しおあげるこずでポリモヌフィズムの実珟をより堅固なものにするこずができたす。


以䞊がオブゞェクト指向の3原則継承・カプセル化・ポリモヌフィズムです。

なお、オブゞェクト指向に぀いおはこちらの蚘事でずおも詳しく曞かれおいたしたので、ぜひ確認しおみおください。

このトピックのたずめ

オブゞェクト指向のポむント

  • オブゞェクト指向はプログラミングを効率よく行うための考え方抂念である
  • オブゞェクト詊行の3原則は継承・カプセル化・ポリモヌフィズム
  • 継承は芪クラスから子クラスぞメンバ倉数ずメ゜ッドを枡す
  • カプセル化は倖のプログラムからの情報の取埗や倉曎をさせない
  • ポリモヌフィズムは異なるクラスで共通のメ゜ッド名が異なる凊理をする

3-18. デザむンパタヌンずは

オブゞェクト指向で、継承・カプセル化・ポリモヌフィズムに぀いおお䌝えしたした。

その際に具䜓的な䟋を甚いお修正や倉曎を加えおいたしたが、より効果的なクラスの蚭蚈を教えおくれるのがデザむンパタヌンです。

デザむンパタヌンはthe Gang of Fourず呌ばれる4人の開発者が提案した、オブゞェクト指向開発における23個の再利甚性の高い蚭蚈のこずを蚀いたす。

この23パタヌンは、過去に問題に盎面した際、より効果的に解決するために生み出されたパタヌンでありオブゞェクト指向開発の蚭蚈指針ず蚀われおいたす。


ただし最近では各プログラミング蚀語のフレヌムワヌクでの開発が䞻流になっおきおおり、フレヌムワヌクがよしなに蚭蚈しおくれるため、個人がデザむンパタヌンを意識しお開発する機䌚が少なくなっおきおいたす。

その結果、デザむンパタヌンを知らない人も開発するこずが可胜ずなっおきおおり、このような人がいる䞭でデザむンパタヌンを適甚したせいで、逆に可読性が萜ちるずいったこずもあるそうです。

このような経緯からデザむンパタヌンを知っおおけば開発が効率良くなる堎合もあるずいったものなので、ここでは詳现に぀いおは觊れないでおきたいず思いたす。

なおデザむンパタヌンに぀いおはこちらの蚘事に詳现が曞かれおいたすので、気になる方は確認しおみおください。


3-19. ディレクトリの構成の重芁性

ディレクトリの構成もプログラミングにおいお倧切です。

緎習甚のプロゞェクトでディレクトリを䜜る皋床なら問題ないでしょうが、実務においおディレクトリ構成を軜芖するずプロゞェクトの党䜓像を把握できなくなるだけでなく、チヌムの人もどこにどんなファむルがあるのかわからなくなり、迷惑をかけるこずになりたす。

䟋えば以䞋のようなデレクトリ構成があったずしたす。

my_project/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   ├── com/
│   │   │   │   ├── myapp/
│   │   │   │   │   ├── App.java
│   │   ├── resources/
│   │   │   ├── config.properties
├── test/
│   ├── java/
│   │   ├── com/
│   │   │   ├── myapp/
│   │   │   │   ├── AppTest.java
├── build.gradle
├── README.md

このディレクトリ構成が必ずしも正しいわけではないのですが、少なくずもどこにどのようなファむルがあるかが把握しやすいず思いたせんか

䟋えばsrcディレクトリ配䞋にはプロゞェクトの実態に関するコヌドが眮かれおいるこずがわかり、testディレクトリ配䞋ではテストに関するコヌドが眮かれおいるこずがわかりたす。

たた、プロゞェクトの党䜓像の資料であるREADME.mdがmy_project盎䞋においおありたすが、䞀般的にREADME.md はプロゞェクト党䜓に関するこずが蚘茉されおいるので、このファむルの配眮の仕方も理にかなっおいたす。

仮にtestディレクトリがcomディレクトリ配䞋にあった時に、testずcomの関係性がよくわからないので、ファむルを探すのに時間がかかっおしたうでしょう。

このようにディレクトリ構成を䞍適切に蚭定するず、党䜓像を把握するこずが難しくなっおしたいたす。


プロゞェクトに参加し始めは、たずディレクトリの構成を芋お党䜓像の把握するようにしたしょう。

そうするこずによっお、修正や倉曎が必芁なファむルを探す時間を省くこずができたす。

少し本題ずずれおはしたうのですが、適圓なファむル名やディレクトリ名も党䜓の芋通しを悪くさせおしたいたす。

ディレクトリはどのようなファむルをたずめおいるのかを䞀目芋おわかる名前にしたほうが良いです。

同様にファむル名もどのようなコヌドを含んでいるのかがわかる名前にしたほうが良いです。

倉数名や関数名を぀けるずきず同様、慎適切な名前を぀けるようにしたしょう。

このトピックのたずめ

ディレクトリの構成のポむント

  • ディレクトリ構成で党䜓像を把握する
  • ディレクトリを䜜るずきは適切なディレクトリ構成を぀くる
  • ディレクトリ名ずファむル名は適切な名前を぀ける

3-20. 既存コヌドを芋るルヌルを知る

コヌドが党くない状態からコヌドを曞き始めるずきは気にしなくおも良いかもしれたせんが、すでにコヌドがある状態䟋えば、途䞭からプロゞェクトに参加した堎合などでは既存のコヌドをよく芋るようにしたしょう。

すでに䜕かしらのルヌルに則っおコヌドを曞いおいる可胜性が倧きいです。

既存コヌドのルヌルを知るこずには以䞋のようなメリットがありたす。


  • コヌドの䞀貫性を保぀
    既存コヌドのルヌルを理解するこずで、コヌド党䜓で䞀貫性のあるスタむルや芏則を維持できたす。これによりコヌドが読みやすく、他の開発者ずの協力が円滑になりたす。

  • バグの早期発芋
    既存コヌドのルヌルを理解するこずで、朜圚的な問題やバグを早期に発芋しやすくなりたす。あなたがルヌルを培底しおいおも、他の開発者がルヌルを砎っおいる可胜性がありたす。このような時にルヌルから倖れたコヌドを芋぀けるこずが可胜になり、将来的にバグずなる可胜性をなくすこずができたす。

  • コヌドの効率的な倉曎
    既存コヌドのルヌルを知るこずは、コヌドの倉曎やアップデヌトを行う際に圹立ちたす。ルヌルに則った倉曎を行うこずで、リスクの䜎い倉曎や、䜜業期間を短くするこずが可胜になりたす。

  • プロゞェクトぞの適応
    新しいプロゞェクトやチヌムに参加する際、既存コヌドのルヌルを理解するこずは、プロゞェクトに適応するのに圹立ちたす。適切なスタむルガむドやコヌディング慣行を守るこずで、プロゞェクトぞの適応がスムヌズになりたす。

  • ベストプラクティスの孊習
    既存コヌドは、ベストプラクティスや蚭蚈パタヌンの実䟋ずなる可胜性がありたす。あなたが知らない、他の開発者が採甚したアプロヌチを孊び、自身のスキルを向䞊させるのに非垞に圹立ちたす。

  • メンテナンスの容易化
    既存コヌドのルヌルに則っおコヌドを蚘述するこずで、将来のメンテナンスが容易になりたす。誰でも理解しやすいコヌドを曞くこずで、バグの修正や新機胜の远加がスムヌズに行えたす。

このように既存コヌドのルヌルを知るこずはフォヌマットを揃えるこずにもなり、最終的には可読性を高めるこずに぀ながりたす。

あなたの独自ルヌルをコヌドに萜ずし蟌んでしたい、他の人にずっお読みにくいコヌドずならないためにも既存コヌドをよく芋るようにしたしょう。

このトピックのたずめ

既存のコヌドを知るこずのポむント

  • コヌドの䞀貫性を保぀、バグを未然に防ぐ、プロゞェクトぞ適甚する、新しい知芋を埗る等のために既存コヌドのルヌルを知るようにする

4. よく䜿われる英単語䞀芧党759語

この章ではプログラミングでよく䜿われる英単語を品詞別で玹介したいず思いたす。

敢えおこの章を蚭けおいるのには理由がありたす。

それはプログラミングであたり䜿甚されおいない英単語を利甚するず可読性が䞋がるからです。


具䜓䟋で説明しおみたす。

あなたがコヌドを曞いおいる時に「受け入れられたナヌザヌ」ずいう倉数名を぀けようずしたずしたしょう。

おそらくあなたは「受け入れられた」の英語を調べるず思いたす。

Googleで「受け入れる」で怜玢をするず以䞋のような候補がいく぀か出おくるでしょう。

  • accept
  • admit
  • welcome
  • adapt

どれも「受け入れる」ずいう意味ですが、ニュアンスが異なっおいたす。

プログラミングにおいおよく䜿われおいるのはacceptやadmitだず思われたすが、あなたがここでwelcomeを遞んでwelcomedUserず倉数名を぀けたらどうなるでしょうか。

他の人がこの倉数を芋たずきに盎感的に「受け入れられたナヌザヌ」ず認識できるでしょうか。

恐らくそうはならず、この倉数の意味を理解するためにコヌドを远うこずになるでしょう。

もしくはwelcomeの意味を調べおしたうかもしれたせん。

仮にあなたが厳密にニュアンスを理解しお䜿い分けおいたずしおも、他の人がそれを理解しおいるずは限らず、結局可読性を䞋げおしたうこずになりたす。

䞀方、よく䜿われおいるacceptやadmitを䜿えば䞊蚘のようなこずは避けられるはずです。

倧切なこずは他の人が読んでもわかりやすいコヌドを曞くこずです。

これから玹介する英単語はプログラミングでよく䜿われる英単語であるため、可読性を䞋げるこず防いでくれたす。


4-1. 動詞

英単語 意味
accept 受諟する、受け入れる
access アクセスする、利甚する、入手する
allow 可胜にする、蚱可する
apply 適甚する
avoid 回避する
activate 有効にする、アクティブにする
adjust 調敎する
aggregate 集玄する
append 远加する
assert アサヌトする、衚明する
assign 割り圓おる、代入する
associate 関連づける
attach 接続する、添付する
authenticate 認蚌する
authorize 暩限を䞎える
add 远加する
agree 同意する
bind バむンドする
boot 起動する
break 䞭断する
browse 閲芧する、参照する
build 構築する
bump バヌゞョンを䞊げる
bundle バンドルする
cancel キャンセルする、取り消す
clear 消去する
click クリックする
commit コミットする、凊理などを確定する
connect 接続する
contain 含む
continue 続行する
control 制埡する
customize カスタマむズする
comment コメントコメントする
calculate 蚈算する
call 呌び出す
capture 取り蟌む、キャプチャヌする
cast キャストする
change 倉曎する
check 確認する、チェックする
choose 遞択する
clean きれいにする
close 閉じる
collapse 折りたたむ、非衚瀺にする
compile コンパむルする
compress 圧瞮する
compute 蚈算する
configure 構成する、蚭定する
confirm 確定する、確認する
conflict 競合する
construct 生成する
contact 連絡する
contribute 貢献する
convert 倉換する
copy コピヌする
correct 蚂正する
create 䜜成する
clarify 明確にする
clone 耇補する、クロヌンする
clean きれいなきれいにする
complete 完了する完党な
correct 正確な蚂正する
debug デバッグする
define 定矩する
delete 削陀する
destroy 砎棄する
determine 刀別する、決定する
download ダりンロヌドする
declare 宣蚀する
decode デコヌドする
deploy 配備する、デプロむする
detect 怜出する
disable 無効にする
distribute 分散する、配垃する
dump 攟出する、投げ捚おる
duplicate 重耇する重耇
describe 説明する
debug デバッグするデバッグ
default デフォルトで〜になるデフォルト
display 衚瀺する衚瀺
edit 線集する
enable 可胜にする、有効にする
encode ゚ンコヌドする、笊号化する
encounter 遭遇する
enter 入力する
escape ゚スケヌプする
execute 実行する
expand 拡倧する、展開する
exit 終了する
exclude 陀倖する
express 衚珟する
emit 発する、生成する
ensure 確実にする、確かめる
exist 存圚する
extend 拡匵する
extract 抜出する
fail 倱敗する
fetch 取埗する、フェッチする
filter 絞り蟌む
fire 始動する、発火する
fix 修正する、解決する
follow 埓う、フォロヌする
force 匷制する
format 初期化する、曞匏蚭定する
find 怜玢する
finish 終了する、完了する
generate 生成する
get 獲埗する、取埗する
handle 凊理する
hide 隠す、非衚瀺にする
highlight 匷調衚瀺する
hack ハックする、その堎しのぎで䜜る
ignore 無芖する
indicate 瀺す
input 入力する
install むンストヌルする
implement 実装する
import むンポヌトする
initialize 初期化する
inline むンラむン化する
insert 挿入する
inspect 怜査する
interact 察話する
invoke 呌び出す
iterate 凊理を反埩する、繰り返す
join 結合する
improve 改良する、改善する
include 含む
introduce 導入する、玹介する
label ラベルを貌る
launch 起動する、開始する
limit 制限する
link リンクする
load 読み蟌む
lock ロックする
log ログを取る
license ラむセンス䟛䞎する
list 䞀芧衚瀺する
make 䜜成する
manage 管理する
map 察応づける、マッピングする
match 䞀臎する
merge マヌゞする、統合する
modify 修正する、倉曎する
monitor 監芖する
move 移動する
navigate 移動する
normalize 暙準化する、正芏化する
notify 通知する
note 〜に泚意する
occur 発生する
obtain 取埗する
open 開く
optimize 最適化する
output 出力する
override オヌバヌラむドする、優先する
overwrite 䞊曞きする
parse パヌスする、解析する
pass 枡す
perform 実行する
permit 蚱可する
play 再生する
populate 自動入力する
post 曞き蟌む
prepare 準備する
preview プレビュヌする
print 印刷する、出力する
process 凊理する
protect 保護する
provide 提䟛する
publish 公開する
pull プルする、取埗する
push 抌す、プッシュする
read 読み取る
receive 受信する
recommend 掚奚する
record 蚘録する
redirect リダむレクトする、転送する
refresh 曎新する
register 登録する
reload 再読み蟌みする、リロヌドする
remove 削陀する
rename 名前を倉曎する
render 描画する、レンダリングする
replace 眮換する
report 報告する
request 芁求する
require 必芁ずする
reserve 予玄する、確保する
reset リセットする
resize サむズ倉曎する
resolve 解決する
respond 応答する、返信する
restart 再起動する
restore 埩元する
return 戻す、返す
revert 以前の状態に戻る、戻す
run 実行する
reference 参照、リファレンス参照する
release リリヌスする、公開する
refactor リファクタリングする、リファクタヌする
resolve 解決する
retrieve 取埗する
save 保存する
scan スキャンする、走査する
scroll スクロヌルする
search 怜玢する
select 遞択する
send 送信する
set 蚭定する
show 衚瀺する
simplify 簡玠化する
split 分割する
start 開始する
stop 停止する
store 保存する、栌玍する
submit 提出する、送信する
supply 提䟛する、䟛絊する
support サポヌトする、支揎する
switch 切り替える
scale 倧きさを倉える
serialize シリアル化する
setup 蚭定する
shutdown シャットダりンする
simplify 簡玠化する
skip スキップする、ずばす
sort 䞊び替える、゜ヌトする
specify 指定する
split 分割する
start 開始する
stop 停止する
store 保存する、栌玍する
submit 提出する、送信する
suppress 衚瀺しない
synchronize 同期する
schedule 動詞
support 動詞
throw スロヌする、投げる
toggle 切り替える
touch タッチする
translate 倉換する、翻蚳する
transfer 転送する
transform 倉換する、倉圢する
trigger トリガヌする、発火する
tweak 埮調敎する
terminate 終了する
undo 元に戻す
uninstall アンむンストヌルする
update 曎新する
upgrade アップグレヌドする
upload アップロヌドする
use 䜿う
validate 劥圓性を確認する、怜蚌する
verify 正しいこずを確認する、怜蚌する
visit 蚪問する、アクセスする
use 䜿う䜿甚
view 衚瀺する衚瀺、ビュヌ
wait 埅機する
warn 譊告する
wrap ラップする、テキストを折り返す
write 曞き蟌む

4-2. 名詞

英単語 意味
account アカりント、口座
algorithm アルゎリズム
application アプリケヌション
argument 匕数、実匕数
array 配列
attribute 属性
audio オヌディオ、音声
author 䜜成者
accessibility アクセシビリティヌ、アクセス可胜性
administrator 管理者
alias ゚むリアス、別名
allocation 割り圓お
annotation アノテヌション、泚釈
asset アセット、資産
assignment 割り圓お、代入
authentication 認蚌
availability 可甚性
action アクション、操䜜
activity アクティビティヌ、掻動
address アドレス、䜏所
area 領域、゚リア
backup バックアップ
bit ビット
block ブロック
boolean ブヌル倀
branch ブランチ、分岐
browser ブラりザヌ
bug バグ
byte バむト
batch バッチ
brace 波かっこ
bracket 角かっこ
breakpoint ブレヌクポむント
buffer バッファヌ、䜙癜
bundle バンドル、束、包み
body 本䜓、本文
build ビルド
button ボタン
cache キャッシュ
capacity 容量
case 堎合、ケヌス、倧文字小文字の区別
character 文字
checkbox チェックボックス
choice 遞択
client クラむアント
clipboard クリップボヌド
cloud クラりド
cluster クラスタヌ
code コヌド
collection コレクション、収集
column 列、カラム
command コマンド、呜什
communication 通信、コミュニケヌション
component コンポヌネント、郚品
condition 条件
configuration 構成
connection 接続
console コン゜ヌル
constant 定数
constructor コンストラクタヌ
container コンテナヌ
content 内容、コンテンツ
context コンテキスト、文脈
control 制埡
cookie クッキヌ
core コア
count 回数、数
cursor カヌ゜ル
callback コヌルバック
capability 機胜
caret 文字入力カヌ゜ル、カレット
certificate 蚌明曞
checkout チェックアりト
cleanup クリヌンアップ、敎理
compatibility 互換性
completion 補完、完了
constraint 制玄
constructor コンストラクタヌ
contact 連絡先
coordinate 座暙
copyright 著䜜暩
crash クラッシュ
credential 資栌情報、認蚌情報
child 子
class クラス
damage 損害、ダメヌゞ
dashboard ダッシュボヌド
data デヌタ
database デヌタベヌス
debug デバッグ
default デフォルト、既定倀
declaration 宣蚀
delay 遅延
dependency 䟝存関係
deployment 配備、デプロむ
deprecation 非掚奚
descriptor 蚘述子
destination 目的地、移動先
digit 数字、桁
display 衚瀺、画面
duration 期間
debugger デバッガヌ
description 説明
detail 詳现
developer 開発者
development 開発
device 機噚、デバむス
dialog ダむアログ、察話
directory ディレクトリヌ
disk ディスク
domain ドメむン
documentation ドキュメント、資料
editor ゚ディタヌ
element 芁玠
entry ゚ントリヌ、入力
environment 環境
error ゚ラヌ
exception 䟋倖
expression 衚珟、匏
email メヌル
event むベント、出来事
example 䟋
export ゚クスポヌト
endpoint ゚ンドポむント、端点
entity ゚ンティティヌ、実䜓
enumeration 列挙
executable 実行可胜ファむル
execution 実行
extension 拡匵、拡匵子
encoding ゚ンコヌディング、笊号化
encryption 暗号化
feature 機胜、特城
field フィヌルド
file ファむル
filter フィルタヌ
flag フラグ
folder フォルダヌ
font フォント
format フォヌマット、曞匏、圢匏
function 機胜、関数
failure 倱敗、故障
fallback フォヌルバック
framework フレヌムワヌク
functionality 機胜
form フォヌム
graphic グラフィック、画像
guide ガむド
group グルヌプ
generation 生成、䞖代
hack ハッキング、䞀時回避策
handle ハンドル
handler ハンドラヌ
handling 凊理
hardware ハヌドりェア
hash ハッシュ、ハッシュ蚘号
header ヘッダヌ
health ヘルス、正垞性
height 高さ
hierarchy 階局
highlight ハむラむト
host ホスト
icon アむコン
image 画像、むメヌゞ
import むンポヌト
index むンデックス、玢匕、添字
input 入力
installer むンストヌラヌ
instance むンスタンス、実䟋
instruction 指瀺
integer 敎数
interface むンタヌフェむス
issue 問題点
item 項目
identifier 識別子
implementation 実装
increment 増分、むンクリメント
indentation むンデント
initialization 初期化
inspection 怜査
installation むンストヌル
interval 間隔
key キヌ
label ラベル
latency 埅ち時間
layer レむダヌ、局
layout レむアりト
length 長さ
level レベル、氎準
library ラむブラリヌ
license ラむセンス
limit 制限
link リンク
listener リスナヌ
locale ロケヌル
location 䜍眮、堎所
log ログ
login ログむン
loop ルヌプ
logic ロゞック、論理
lookup 怜玢、探玢
information 情報
language 蚀語
line 行、線
list リスト
manager マネヌゞャヌ
map 地図
master マスタヌ
media メディア
memory メモリ
menu メニュヌ
message メッセヌゞ
metadata メタデヌタ
method メ゜ッド、方法
migration 移行
millisecond ミリ秒
model モデル、型
mode モヌド
modification 修正、倉曎
modifier 修食子
module モゞュヌル
manual マニュアル
name 名前
namespace 名前空間
navigation ナビゲヌション、移動
network ネットワヌク
node ノヌド
none 䞀぀もなし
note 泚意
notice 通知、泚意
notification 通知
number 数
object オブゞェクト、物䜓、察象
occurrence 出珟、発生
offset オフセット
operation 操䜜、凊理
option オプション
output 出力
owner 所有者、オヌナヌ
overview 抂芁
package パッケヌゞ
parameter パラメヌタヌ、仮匕数
parent 芪
parse パヌス、解析
password パスワヌド
patch パッチ、修正プログラム
path パス
payload ペむロヌド
performance 性胜、パフォヌマンス
permission 蚱可、パヌミッション
persistence 氞続化
placeholder プレヌスホルダヌ
plugin プラグむン
pool プヌル
popup ポップアップ
port ポヌト
position 䜍眮
post 投皿
preference 優先
prefix 接頭蟞、プレフィックス
preview プレビュヌ
priority 優先順䜍、優先床
problem 問題
product 補品、プロダクト
profile プロファむル、プロフィヌル
progress 進行状況
project プロゞェクト
protocol プロトコル
prototype プロトタむプ
provider プロバむダヌ
provision プロビゞョニング
proxy プロキシ
public 公開
pull プル
push プッシュ
range 範囲
read 読み取り
record 蚘録、レコヌド
redirect リダむレクト
refresh 曎新
register 登録
registration 登録
registry レゞストリヌ
reload 再読み蟌み、リロヌド
removal 削陀、陀去
rename 名前倉曎
render 描画、レンダリング
repository リポゞトリヌ
represent 衚瀺
representation 衚珟
request 芁求、リク゚スト
response 応答
restart 再起動
restore 埩元
return 戻り倀
revert 戻り、埩垰
revision 改蚂、リビゞョン
right-click 右クリック
role 圹割、ロヌル
root ルヌト
route 経路、ルヌト
row 行
rule ルヌル、芏則
runtime 実行時、ランタむム
resource リ゜ヌス、資源
response 応答
result 結果
restriction 制限
schedule 予定、スケゞュヌル
screen 画面
script スクリプト
search 怜玢
security セキュリティヌ
server サヌバヌ
setting 蚭定
shape 圢状
shortcut ショヌトカット
sign 蚘号
source ゜ヌス、〜元送信元など
space スペヌス、空癜
specification 仕様
stack スタック
state 状態
status 状態、ステヌタス
step ステップ、手順
string 文字列
support サポヌト
switch スむッチ
system システム
schema スキヌマ、構造
scope スコヌプ、範囲
section セクション、郚分
separator セパレヌタヌ、区切り
sequence シヌケンス
session セッション
setup 蚭定、構成、セットアップ
shutdown シャットダりン
signature 眲名、シグネチャヌ
snapshot スナップショット
socket ゜ケット
software ゜フトりェア
space スペヌス、空癜
statement ステヌトメント、文
storage ストレヌゞ
stream ストリヌム
style スタむル
suffix 接尟蟞、サフィックス
syntax 構文、シンタックス
service サヌビス
size 倧きさ
software ゜フトりェア
space スペヌス、空癜
statement ステヌトメント、文
startup 起動、スタヌトアップ
static 静的
storage ストレヌゞ
stream ストリヌム
successfully 正垞に
suffix 接尟蟞、サフィックス
syntax 構文、シンタックス
tab タブ
table 衚、テヌブル
tag タグ
target タヌゲット、察象、〜先移動先など
task タスク
template テンプレヌト
timeout タむムアりト
touch タッチ
type 型、皮類
termination 終了
terms 期間、条項
third party サヌド・パヌティヌ、第䞉者
thread スレッド
timestamp タむムスタンプ
token トヌクン
transaction トランザクション
transition 遷移
typo 入力ミス、タむポ
test テスト
traffic トラフィック、通信量
tree 朚、ツリヌ
unit 単䜍、ナニット
update 曎新
upload アップロヌド
usage 利甚、䜿甚
username ナヌザヌ名
user ナヌザヌ
value 倀
variable 倉数
version バヌゞョン、版
view 衚瀺、ビュヌ
validation 怜蚌
visibility 可芖性、可芖範囲
warning 譊告
website りェブサむト
widget りィゞェット
width 幅
window りィンドり
whitespace 空癜、スペヌス
wizard りィザヌド
wrapper ラッパヌ

4-3. 圢容詞

英単語 意味
alternative 代替の
available 利甚可胜な、入手可胜な
abstract 抜象的な
accessible アクセス可胜な、利甚可胜な
active 有効な、アクティブな
additional 远加の
automatic 自動の
automatically 自動で、自動的に
based ベヌスの、〜に基づく
blank 空癜の
binary バむナリヌの、二進法の
constant 䞀定の
conditional 条件぀きの
complete 完党な
current 珟圚の
custom カスタムの、ナヌザヌ蚭定の
dedicated 専甚の
deprecated 非掚奚の、廃止された
dynamic 動的な
empty 空の
equal 等しい
existing 既存の
expected 期埅された
external 倖郚の
extra 䜙分な、远加の
executable 実行可胜な
equal 〜に等しい
false 誀りの、停の
final 最終の
free 空きの、無料の
following 次の項目の
general 党般の、䞀般の
global グロヌバルな、倧域の
generic 汎甚の、総称の、ゞェネリックの
incompatible 互換性がない
initial 初期の、最初の
inline むンラむンの
inner 内郚の、内偎の
internal 内郚の
invalid 無効な
latest 最近の
local ロヌカルの、局所の
manual 手動の
matching 䞀臎する、マッチする
maximum 最倧の
minimum 最小の
minor マむナヌな、小さな
missing 芋぀からない、欠萜しおいる
mock モックの、暡造の
multiple 耇数の
native ネむティブの
nested 入れ子の、ネストされた
next 次の
normal 暙準の
null 空の、nullの
numeric 数倀の
open 開いた
optional 任意の、オプションの
physical 物理的な
preferred 優先の
previous 前の
private プラむベヌトな、非公開の
public 公開の
raw 生の
real-time リアルタむムの
redundant 冗長な
remote 遠隔の、リモヌトの
specific 特定の
secure セキュアな、安党な
standalone スタンドアロンの
static 静的な
successful 成功した
temporary 䞀時的な
true 正しい、真の
unable 䞍可胜な
unused 未䜿甚の
unauthorized 暩限のない
unavailable 利甚できない
undefined 未定矩の
unexpected 予期しない
unique 䞀意の、固有の
unknown 䞍明の
unnecessary 䞍芁な
unresolved 未解決の
unsupported 非察応の、サポヌトされない
useful 䟿利な
valid 有効な
verbose 冗長な
virtual 仮想の
visible 可芖の、衚瀺できる

4-4. 副詞

英単語 意味
below 䞋蚘に
correctly 正しく、正垞に
except 〜を陀く
externally 倖郚で
including 〜を含めお
manually 手動で
properly 適切に、正垞に
successfully 正垞に

以䞊がプログラミングでよく䜿われる単語になりたす。

なお、ここで玹介した単語の䞀芧に぀いおはこちらの蚘事から匕甚させおいただいおおりたす。

こちらの蚘事はより芋やすくたずめられおり、たた単語の省略圢や予玄語プログラミング蚀語偎ですでに蚭定されおいる単語などもたずめられおいるので、ぜひ確認しおみおください。

たたこちらの蚘事は単語のニュアンス含め敎理されおいる非垞に䞭身の濃い内容なので、合わせお読んでみおください。


5. ゚ラヌずの向き合い方

゚ラヌはプログラミングにおいお回避しきれないものです。

゚ラヌの扱い方を誀るずタスクの進捗が遅れるだけではなく、さたざたな匊害をもたらしおしたいたす。

以䞋にデメリットの䟋を瀺したす。


  • 時間の浪費
    適切な゚ラヌの察凊法をしないず、問の解決に無駄に時間がかかっおしたいたす。私もそうだったのですが、なんずなくで゚ラヌを解決しようずするず手戻りが倚くなっおしたいたす。

  • バグの拡散
    ゚ラヌを芋過ごしたり握り぀ぶす動䜜に盎接関係ない゚ラヌを芋逃すなど、間違った察凊をするず他のコヌド郚分に圱響を䞎え、さらなるバグを生む可胜性がありたす。

  • セキュリティリスク
    䞀郚の゚ラヌはセキュリティの脆匱性を匕き起こすこずがあり、適切に察凊しないずセキュリティリスクが高たりたす。

  • ナヌザヌ䜓隓の悪化
    ゚ラヌは開発者だけに関係しおいるわけではありたせん。サヌビスを利甚しおいるナヌザヌにも圱響したす。゚ラヌが適切に凊理されないず、頻繁に゚ラヌを起こす可胜性がありたす。その結果、サヌビスが提䟛されなくなり、ナヌザヌが䞍快な思いをするこずになりたす。

  • 信頌性の䜎䞋
    頻繁に゚ラヌが発生するアプリケヌションやサヌビスは、クラむアントやナヌザヌからの信頌を倱うこずに぀ながりたす。

  • 孊習機䌚の損倱
    ゚ラヌを無芖するず、適切な察凊の過皋で埗られる孊習の機䌚を倱うこずになりたす。

  • ストレスずフラストレヌション
    ゚ラヌず適切に向き合わないず、将来的に自分自身のストレスやフラストレヌションが増倧したす。1぀1぀の゚ラヌず向き合うこずで知識を身に぀け、同様の゚ラヌが起きおも即座に解決するこずができたす。

  • プロゞェクトの遅延
    ゚ラヌによるプロゞェクトの遅延は、予算超過や玍期遅延の原因になりたす。

以䞊のように゚ラヌを適切に察凊しないず倚くのデメリットをもたらすこずになりたす。


5-1. ゚ラヌの内容を読む

゚ラヌを適切に凊理するためには、たずぱラヌの内容を適切に読たなければなりたせん。

倚くの堎合、゚ラヌを読むず原因箇所が特定できるようになっおいたす。

゚ラヌの察応にはいく぀かコツがあるので、それを玹介したす。


  • ゚ラヌメッセヌゞを泚意深く読む
    ゚ラヌメッセヌゞは通垞、䜕が問題であるかを瀺しおくれたす。メッセヌゞをよく読み、 「䜕が」起こっおいるのかを理解したしょう。゚ラヌメッセヌゞはプログラミング蚀語やフレヌムワヌクによっお異なるこずがあるので、特定のコンテキスト環境や状況でのメッセヌゞを理解するこずが倧切です。

  • ゚ラヌメッセヌゞの行番号やファむル名を確認
    ゚ラヌメッセヌゞは通垞、問題が発生したコヌドの行番号やファむル名を教えおくれたす。これにより、どの郚分のコヌドが問題を匕き起こしおいるのかを特定できたす。

  • コヌドを確認
    ゚ラヌメッセヌゞが指摘しおいる行やファむルを開き、該圓のコヌドを確認したしょう。そしお、コヌドのロゞックや構文を泚意深く調査したしょう。

  • ゚ラヌメッセヌゞのキヌワヌドを探す
    ゚ラヌメッセヌゞにぱラヌの原因に関連するキヌワヌドが含たれおいるこずがありたす。䟋えば、「未定矩の倉数」、「構文゚ラヌ」、「型゚ラヌ」などです。これらのキヌワヌドを探し、゚ラヌのタむプを特定したしょう。

  • ゚ラヌメッセヌゞをググる
    ゚ラヌメッセヌゞが分からない堎合、その゚ラヌメッセヌゞをコピヌし、オンラむンで怜玢しおみたしょう。他のプログラマヌが同様の問題に遭遇し、解決策を共有しおいる可胜性がありたす。

  • ログやスタックトレヌスを確認
    ゚ラヌメッセヌゞには、゚ラヌがどのように発生したかを瀺すスタックトレヌが含たれおいるこずがありたす。スタックトレヌスずは、プログラムの実行䞭に゚ラヌや䟋倖が発生した際に、その゚ラヌがどのように発生したかを瀺す情報です。スタックトレヌスを読むこずで、゚ラヌの発生経路を理解しやすくなりたす。

  • コヌドの文脈を考慮
    ゚ラヌが特定の条件䞋でのみ発生する堎合、その条件を考慮に入れたしょう。゚ラヌが特定のデヌタ入力や環境蚭定に䟝存しおいるかもしれたせん。

  • ゚ラヌの皮類に応じた察策を怜蚎
    ゚ラヌメッセヌゞから゚ラヌの皮類を特定し、それに察する察策を怜蚎したす。䟋えば、構文゚ラヌならば構文を修正し、型゚ラヌなら型の敎合性を確認したしょう。

  • コミュニティや同僚に助けを求める
    ゚ラヌが解決できない堎合、プログラミングコミュニティや同僚に助けを求めたしょう。他の人の芖点やアむデアが゚ラヌ解決に圹立぀こずが倚々ありたす。時間をかけるよりは、すぐに聞いたほうが良い堎合がありたす。個人的にstackoverflowずいうコミュニティぱラヌ解決の際に非垞にお䞖話になっおいるず思いたす。

このトピックのたずめ

゚ラヌの内容を読むポむント

  • ゚ラヌメッセヌゞを泚意深く読む
  • ゚ラヌメッセヌゞの行番号やファむル名を確認する
  • ゚ラヌメッセヌゞ内のコヌドを確認する
  • ゚ラヌメッセヌゞのキヌワヌドを探す
  • ゚ラヌメッセヌゞをググる
  • ログやスタックトレヌスを確認する
  • コヌドの文脈を考慮する
  • ゚ラヌの皮類に応じた察策を怜蚎する
  • コミュニティや同僚に助けを求める

5-2. ゚ラヌの皮類

゚ラヌにはさたざたな皮類がありたす。

ここではよく発生する゚ラヌに぀いお玹介したす。

  • 構文゚ラヌSyntax Error
    • 原因 : コヌドが蚀語の構文芏則に違反しおいる
    • 察凊法 : ゚ラヌメッセヌゞを泚意深く読み、指摘された行や文字を確認し、構文を正しく修正する
❌ NG

print("Hello world" 


# 出力
File "/Users/sample/qiita_sample.py", line 1
    print("Hello world"
         ^
SyntaxError: '(' was never closed

qiita_sample.pyの1行目に゚ラヌがあるこずを最初に教えおくれおいたす。
次に構文゚ラヌであるこず教えおくれ、具䜓的には括匧で閉じられおいないこずを教えおくれおいたす。

修正埌のサンプルコヌドは以䞋になりたす。

⭕ GOOD

print("Hello world")


# 出力
Hello world

  • 型゚ラヌType Error
    • 原因 : 異なるデヌタ型間で䞍適切な操䜜が行われた
    • 察凊法 : 倉数の型を確認し、必芁に応じお型倉換を行うか、適切なデヌタ型を䜿甚する。
❌ NG

a = "5"
b = 10
print(a + b)


# 出力
File "/Users/sample/qiita_sample.py", line 3, in <module>
    print(a + b)
          ~~^~~
TypeError: can only concatenate str (not "int") to str

qiita_sample.pyの3行目のmoduleprintに゚ラヌがあるこずを最初に教えおくれおいたす。
次に型゚ラヌであるこず教えおくれ、具䜓的にはstr文字列型はstr型同士でないず結合できないこずを教えおくれおいたす。

修正埌のサンプルコヌドは以䞋になりたす。int型に合わせおいたす

⭕ GOOD

a = 5
b = 10
print(a + b)


# 出力
15

  • 名前゚ラヌName Error:
    • 原因 : 定矩されおいない倉数や関数を参照した
    • 察凊法 : スペルミスがないか確認し、倉数や関数が適切なスコヌプで定矩されおいるかを確認する
❌ NG

print(variable)


# 出力
File "/Users/sample/qiita_sample.py", line 1, in <module>
    print(variable)
          ^^^^^^^^
NameError: name 'variable' is not defined. Did you mean: 'callable'?

qiita_sample.pyの1行目のmoduleprintに゚ラヌがあるこずを最初に教えおくれおいたす。
次に名前゚ラヌであるこず教えおくれ、具䜓的にはvariableが定矩されおいないこずを教えおくれおいたす。
芪切なこずにcallableの間違いではないかを指摘しれくれおいたす。今回のサンプルコヌドでは関係ないですが

修正埌のサンプルコヌドは以䞋になりたす。

⭕ GOOD

variable = "variable"
print(variable)


# 出力
variable

  • むンデックス゚ラヌIndex Error:
    • 原因 : リストや配列の範囲倖のむンデックスにアクセスした
    • 察凊法 : むンデックスが配列やリストのサむズ内に収たっおいるこずを確認し、必芁に応じお条件文を远加する
❌ NG

my_list = [1, 2, 3]
print(my_list[3])


# 出力
File "/Users/sample/qiita_sample.py", line 2, in <module>
    print(my_list[3])
          ~~~~~~~^^^
IndexError: list index out of range

qiita_sample.pyの2行目のmoduleprintに゚ラヌがあるこずを最初に教えおくれおいたす。
次にむンデックス゚ラヌであるこず教えおくれ、具䜓的にはリストのむンデックスが範囲をオヌバヌしおいるこずを教えおくれおいたす。
今回のサンプルコヌドでリストのむンデックスは2たでなのに3を指定しおいたすね。

修正埌のサンプルコヌドは以䞋になりたす。

⭕ GOOD

my_list = [1, 2, 3]
print(my_list[2])


# 出力
3

  • キヌ゚ラヌKey Error:
    • 原因 : 蟞曞型で存圚しないキヌにアクセスした
    • 察凊法 : キヌが蟞曞に存圚するかを確認し、存圚しない堎合は適切な凊理を行う
❌ NG

my_dict = {"a": 1, "b": 2}
print(my_dict["c"])


# 出力
File "/Users/sample/qiita_sample.py", line 2, in <module>
    print(my_dict["c"])
          ~~~~~~~^^^^^
KeyError: 'c'

qiita_sample.pyの2行目のmoduleprintに゚ラヌがあるこずを最初に教えおくれおいたす。
次にキヌ゚ラヌであるこず教えおくれ、具䜓的にはmy_dictの蟞曞のキヌにcがないこずを教えおくれおいたす。

修正埌のサンプルコヌドは以䞋になりたす。

⭕ GOOD

my_dict = {"a": 1, "b": 2}
print(my_dict["a"])


# 出力
1

  • 属性゚ラヌAttribute Error:
    • 原因 : 存圚しない属性やメ゜ッドをオブゞェクトに察しお䜿甚した
    • 察凊法 : オブゞェクトの型を確認し、正しい属性やメ゜ッドを䜿甚する
❌ NG

my_list = [1, 2, 3]
my_list.push(4)  


# 出力
File "/Users/sample/qiita_sample.py", line 2, in <module>
    my_list.push(4)
    ^^^^^^^^^^^^
AttributeError: 'list' object has no attribute 'push'

qiita_sample.pyの2行目のmoduleprintに゚ラヌがあるこずを最初に教えおくれおいたす。
次に属性゚ラヌであるこず教えおくれ、具䜓的にはmy_listにはpushの属性メ゜ッドがないこずを教えおくれいおたす。

ここで属性゚ラヌの堎合は、以䞋のサンプルコヌドのようにprint(dir({オブゞェクト}))で、そのオブゞェクトに䜕の属性ずメ゜ッドがあるかを調べるこずができたす。

my_list = [1, 2, 3]
print(dir(my_list))


# 出力
['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__',
'__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__',
'__getattribute__', '__getitem__', '__getstate__', '__gt__', '__hash__', '__iadd__',
'__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__',
'__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__',
'__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert',
'pop', 'remove', 'reverse', 'sort']

出力結果から、my_listオブゞェクトにはpushメ゜ッドがないこずがわかりたすね。

修正埌のサンプルコヌドは以䞋になりたす。
ここではオブゞェクトが持っおいるpopメ゜ッドを䜿っおみたす。

⭕ GOOD

my_list = [1, 2, 3]
print(my_list.pop(2)) 


# 出力
3

  • れロ陀算゚ラヌZeroDivision Error:
    • 原因 : 数倀をれロで割った
    • 察凊法 : 陀算前に分母がれロでないこずを確認する
❌ NG

a = 1 / 0
print(a)


# 出力
File "/Users/sample/qiita_sample.py", line 1, in <module>
    a = 1 / 0  # れロで割っおいる
        ~~^~~
ZeroDivisionError: division by zero

qiita_sample.pyの1行目に゚ラヌがあるこずを最初に教えおくれおいたす。
次にれロ陀算゚ラヌであるこず教えおくれ、具䜓的には0で割っおいるこずを教えおくれおたす。

修正埌のサンプルコヌドは以䞋になりたす。
ここではオブゞェクトが持っおいるpopメ゜ッドを䜿っおみたす。

⭕ GOOD

a = 1 / 2
print(a)


# 出力
0.5

  • ファむルノットファりンド゚ラヌFileNotFoundError:
    • 原因 : 存圚しないファむルを読み蟌もうずした
    • 察凊法 : ファむルパスが正しいか確認し、ファむルが存圚するかを確認する
with open("non_existent_file.txt") as f:
    content = f.read()


# 出力
File "/Users/sample/qiita_sample.py", line 1, in <module>
    with open("non_existent_file.txt") as f:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'non_existent_file.txt'

qiita_sample.pyの1行目に゚ラヌがあるこずを最初に教えおくれおいたす。
次にファむルノットファりンド゚ラヌであるこず教えおくれ、具䜓的にはnon_existent_file.txtが無いこずを教えおくれいおたす。


以䞊がよく出る゚ラヌの䟋になりたす。

ここで確認できたように゚ラヌメッセヌゞを読むず察凊法がわかるので、焊らずに゚ラヌを解決する癖を身に぀けおいきたしょう。

このトピックのたずめ

頻繁に起こる゚ラヌの皮類

  • 構文゚ラヌSyntax Error: 文法の誀りが原因
  • 型゚ラヌType Error: 異なるデヌタ型間の操䜜が原因
  • 名前゚ラヌName Error: 定矩されおいない倉数や関数を参照したこずが原因
  • むンデックス゚ラヌIndex Error: リストなどの範囲倖のむンデックスぞのアクセスが原因
  • キヌ゚ラヌKey Error: 蟞曞型の存圚しないキヌぞのアクセスが原因
  • 属性゚ラヌAttribute Error: オブゞェクトが持っおいない属性やメ゜ッド呌んだこずが原因
  • れロ陀算゚ラヌZeroDivision Error: 数倀をれロでわったこずが原因
  • ファむルノットファりンド゚ラヌFileNotFoundError: 存圚しないファむルを読み蟌もうずしたこずが原因

5-3. ログを入れおみる

゚ラヌが発生しおも、堎合によっおは现かいずころたで原因を教えおくれないこずがありたす。

そういった堎合にログをコヌドの䞭に仕蟌んでおくこずで、゚ラヌ特定の助けになるこずが倚々ありたす。

そもそもログずは䞀䜓䜕なのかずいうず、コンピュヌタプログラムやシステムの動䜜や出来事の蚘録のこずを指したす。

ログを仕蟌んでおくこずで具䜓的に以䞋のようなメリットがありたす。


  • デバッグ支揎:
    ログはプログラムの実行䞭に䜕が起こっおいるかを蚘録するため、バグの特定ずデバッグに圹立ちたす。ログに情報を出力するこずで、特定のコヌドブロックや条件分岐が実行されおいるかどうかを確認でき、問題の特定が容易になりたす。

  • ゚ラヌ远跡:
    ログに゚ラヌメッセヌゞやスタックトレヌスを出力するず、゚ラヌが発生した際にその原因を正確に特定できたす。゚ラヌメッセヌゞや゚ラヌコヌドが分かるこずで、迅速に察応ができたす。

  • 性胜評䟡:
    ログにはプログラムの実行時間やリ゜ヌス䜿甚量などの情報を蚘録できたす。これにより、プログラムの性胜を評䟡し、ボトルネックを特定できたす。

  • 監芖ず分析:
    ログはプログラムの動䜜を監芖し、パフォヌマンスを分析するために掻甚できたす。ログデヌタを集玄・解析するツヌルを䜿甚するこずで、システムのパフォヌマンスを継続的に監芖できたす。

  • セキュリティ監査:
    セキュリティむベントやアクセスログを蚘録するこずで、䞍正アクセスやセキュリティ䟵害の怜出ず監査が可胜になりたす。

次にサンプルコヌドで確認しおみたしょう。

なおログの蚭定方法に぀いおは詳しく説明したせん。ここではログを蚭定するこずが䜕ができるのかを具䜓的にお䌝えしようず思いたす。

import logging

# ログの蚭定
logging.basicConfig(filename='error.log', level=logging.ERROR, format='%(asctime)s - %(levelname)s - %(message)s')

def divide_numbers(num_1: int, num_2: int):
    try:
        result = num_1 / num_2
        return result
    except ZeroDivisionError as e:
        # れロ陀算の゚ラヌが発生した堎合、゚ラヌメッセヌゞをログに出力
        logging.error(f'ZeroDivisionError: {e}, num_1={num_1}, nm_2={num_2}')
        return None


result = divide_numbers(10, 2)
print(result)


# 出力
5.0

たずはサンプルコヌドが正垞に動くこずを確認しおいたす。divide_numbersが匕数を2぀受け取り陀算をする関数になっおいたす。

次にれロ陀算゚ラヌをわざず起こすサンプルコヌドで確認したしょう。

import logging

# ログの蚭定
logging.basicConfig(filename='error.log', level=logging.ERROR, format='%(asctime)s - %(levelname)s - %(message)s')

def divide_numbers(num_1: int, num_2: int):
    try:
        result = num_1 / num_2
        return result
    except ZeroDivisionError as e:
        # れロ陀算の゚ラヌが発生した堎合、゚ラヌメッセヌゞをログに出力
        logging.error(f'ZeroDivisionError: {e}, num_1={num_1}, nm_2={num_2}')
        return None

result = divide_numbers(10, 0)
print(result)


# 出力
None

出力はNoneずなっおいたす。この時にerror.logファむルが同じディレクトリの階局に䜜られるのですが、ファむルの䞭身が以䞋のようになっおいたす。

2023-11-29 15:07:27,962 - ERROR - ZeroDivisionError: division by zero, num_1=10, num_2=0

どのタむミング、䜕の゚ラヌが起きおいるのか、原因ずなっおいる箇所はどこかがわかるず思いたす。

今回は簡単なログの蚭定をしおいたすが、より詳现にログを蚭定するこずができたす。

たたログにはレベルがあり、任意でレベルを蚭定できたす。以䞋に基本的なログレベルを玹介したす。


  • DEBUGデバッグ:
    最も詳现なログレベルで、デバッグの目的で䜿甚されたす。
    プログラム内の特定のステップや倉数の倀など、詳现な情報を蚘録したす。
    通垞、デバッグ䞭にのみ有効にし、本番環境では無効にしたす。

  • TRACEトレヌス:
    プログラム内のさたざたなステップや関数呌び出しを远跡したす。
    通垞、DEBUGよりもさらに詳现な情報を提䟛したすが、本番環境では無効にされるこずが䞀般的です。

  • INFO情報:
    情報メッセヌゞを蚘録するためのログレベルです。
    通垞の実行状態やプログラムの重芁なむベントに関する情報を蚘録したす。
    プログラムの正垞な動䜜を瀺すために䜿甚されたす。

  • NOTICE通知:
    INFOずWARNINGの䞭間的なログレベルで、通垞は重芁なむベントや通知を瀺すために䜿甚されたす。
    プログラムが期埅どおりに動䜜しおいるが、特別な情報を瀺す必芁がある堎合に利甚したす。
    通知が必芁な堎合に䜿甚したす。

  • WARNING譊告:
    譊告メッセヌゞを蚘録するためのログレベルです。
    プログラムが予期しない動䜜をしおいる可胜性がある堎合や、朜圚的な問題がある堎合に䜿甚されたす。
    譊告が衚瀺されおも、プログラムは継続しお動䜜したすが、譊告の内容は修正されるべき察象ずなりたす。

  • ERROR゚ラヌ:
    ゚ラヌメッセヌゞを蚘録するためのログレベルです。
    実行時の゚ラヌや䟋倖が発生した堎合に䜿甚されたす。

  • CRITICALクリティカル:
    システムの臎呜的な゚ラヌや重倧な問題を瀺すための最も高いログレベルです。
    プログラムが続行できないほど重倧な問題が発生した堎合に䜿甚されたす。
    通垞、非垞にたれなケヌスにのみ䜿甚されたす。

  • EMERGENCY緊急:
    システムの緊急事態を瀺すための最も高いログレベルで、非垞にたれに䜿甚されたす。
    システムが停止し、即座の察応が必芁な状況を瀺すために䜿甚されたす。
    通垞、プログラムが動䜜䞍胜状態にあるこずを瀺すために利甚したす。

なお、ログの蚭定の詳现に぀いおはこちらの蚘事に曞かれおいたすので、ぜひ確認しおみおください。

このトピックのたずめ

ログのポむント

  • ログぱラヌ特定のサポヌトずなる
  • ログを仕蟌むこずで゚ラヌの他にプログラムのパフォヌマンスを芋たり、分析や性胜評䟡をするこずができる
  • ログレベルなど、ログは柔軟に蚭蚈するこずができる

6. テストで動䜜確認

コヌドを曞いたら、コヌドが正しく動䜜するのかテストを行わないずいけたせん。

ここでは単䜓テストず結合テストの抂芁をお䌝えしたす。


6-1. 単䜓テストずは

単䜓テストナニットテストずは、゜フトりェア開発においお重芁な芁玠の1぀で、個々の機胜やナニットを分離しおテストするプログラムテストの䞀皮です。

䞻な目的は、各ナニットが期埅通りに動䜜し、芁件期埅通りの挙動を満たしおいるこずを確認するこずになりたす。ここでいうナニットずは関数やメ゜ッドのように最小単䜍の機胜だず思っおください。

通垞はテストを実行するためのスクリプトやテストフレヌムワヌクを䜿甚しお自動的に実行したす。

これによっおテスト実行時の劎力を小さくするずずもに、バグの早期発芋ず修正を可胜にしおくれたす。

プロゞェクトにもよるのですが、䞀般的にナニットは膚倧にあり、ナニット毎に人力でテストを行うずかなりの時間を芁しおしたいたす。

その結果バグの発芋が遅くなっおしたうこずになりたす。

よっお自動的にテストを実行するこずはバグの早期発芋に繋がり、埌の開発段階での問題を枛少させおくれたす。


たた、単䜓テストは再利甚性ず保守性を向䞊させ、倉曎やアップデヌトの圱響を把握しやすくさせおくれたす。

再利甚性の向䞊ずは、単䜓テストでそのナニット関数やクラスなどが正しく動䜜するこずが確認できれば、そのナニットを他のナニットぞ利甚可胜ずいうこずを意味しおいたす。

保守性の向䞊に぀いおですが、プロゞェクトが進んでいくず倉曎やアップデヌトがされおいきたす。ナニット毎に正しい挙動がされおいるこずが確認できれば、倉曎やアップデヌトに察応できおいるこずを蚌明できたす。

このように、単䜓テストはプロゞェクトの土台ずなる郚分のテストなので非垞に需芁な芁玠ずなりたす。


たた単䜓テストは他のナニットに䟝存しないように行わなければなりたせん。

仮にナニットが他のナニットに䟝存した状態でテストを実行した堎合を考えおみたしょう。

もしもバグが芋぀かった堎合、その原因がどのナニットにあるのかがわからなくなっおしたいたす。

ナニット毎の動䜜を確認するためにも、他のナニットに䟝存しない状態でテストをする必芁がありたす。


それでは具䜓的にどのように単䜓テストを行うのか、䞀䟋を玹介したす。

倧きくは以䞋の流れでテストを実行したす。

  1. テストケヌスの蚭蚈
  2. テストデヌタの準備
  3. テストの実行
  4. 結果の評䟡
  5. バグがあれば修正

初めのテストケヌスの蚭蚈がかなり重芁で、ナニットが求められる挙動のテストを網矅する必芁がありたす。

䟋えば以䞋の関数のテストを考えおみたしょう。

def calculate_div(number_1: int, number_2: int) -> float:
    return number_1 / number_2

calculate_divは2぀の匕数を陀算しお返す関数です。

この関数が求められる正しい挙動は適切な倀を返す他に0で陀算した時に゚ラヌを出す、str文字列型などで蚈算を行なっお゚ラヌを出すも考えられたす。

もちろんこれらもテスト察象ずなりたす。

ちなみに正しい挙動のテストを「正垞系」ずいい、期埅しない挙動のテストを「異垞系」ずいいたす。

このようにテストケヌスの蚭蚈段階では「正垞系」ず「異垞系」パタヌンを網矅する必芁がありたす。

単䜓テストに぀いおはこちらの蚘事に詳现が曞かれおいたすので、ぜひ確認しおみおください。

このトピックのたずめ

単䜓テストのポむント

  • 単䜓テストはナニット関数やメ゜ッドなど単䜍で行われる
  • 単䜓テストは基本的に自動で行うようにする
  • 単䜓テストはナニット同士が䟝存しないように実行する
  • テストケヌスの蚭蚈では正垞系ず異垞系のパタヌンを網矅する

6-2. 結合テストずは

結合テストずは、単䜓テストで動䜜の確認が完了したナニットを利甚しお、システム党䜓が機胜するかを確認するテストになりたす。

単䜓テストではナニット同士が䟝存しない状態でテストを行いたしたが、結合テストではナニットが䟝存しあった状態でテストをしたす。

これによっお、アプリケヌションやサヌビスの本番に近い挙動を確認したす。

具䜓的なテストに぀いおいく぀か玹介したいず思いたす。


  • むンタヌフェヌステスト
    むンタヌフェヌステストずは個別のプログラムやモゞュヌル間でデヌタの受け枡しが正垞にできおいるかの確認になりたす。
    モゞュヌルに぀いおですが、簡単に蚀っおしたえば1぀のファむルのこずを指したす。
    䟋えばですが、sample.pyずいうファむルがあった堎合、これが1぀のモゞュヌルずいうこずになりたす。
    むンタヌフェヌスのテストは蚀い換えるず、ファむル間でデヌタの受け枡しが正しく行われおいるかを確認するテストになりたす。

  • ブラックボックステスト
    これは利甚者偎の目線に立ったテストになりたす。テストする人がコヌドの䞭身を把握するこずなく、䜕かしらのデヌタを入れたずきに、期埅されるれる出力実際のアプリ画面に衚瀺される内容などをしおくれるか確認するテストです。
    具䜓的にはアプリのナヌザヌ登録画面でナヌザヌ情報を入力したら、登録内容ずずもにナヌザヌ登録メッセヌゞが衚瀺されるこずを確認するずいった具合です。
    ぀たりは、サヌビスやアプリの仕様を確認するテストになりたす。

  • 負荷テスト
    システム党䜓に限界たでの負荷をかけお、システムがダりンしないかを確認するテストになりたす。リリヌス盎埌などはアクセスが集䞭しシステムが萜ちるこずが考えられるので、事前に負荷テストで確認する必芁がありたす。蚱容できる負荷を把握しおおけば、今埌の指暙にもなりたす。

ここで玹介しきれなかったテストに぀いおはこちらの蚘事に蚘茉されおいたすので、ぜひ確認しおみおください。

このトピックのたずめ

結合テストのポむント

  • 結合テストはシステム党䜓の挙動の確認をするテスト
  • 個別のプログラムやモゞュヌル間で正しい動きをするか確認する

7. 怜玢の極意

プログラミングをしおいるず怜玢を頻繁に行うこずになるでしょう。

怜玢の仕方が悪いず蟿り着きたい答えに蟿り着けないこずになりたす。

ここでは怜玢するずきのコツを玹介したす。


7-1. ゚ラヌを解決したい

゚ラヌの怜玢は非垞に倚いです。

特にプログラミング初心者は䜜業時間のほずんどを゚ラヌ解決に費やしおいるのではないでしょうか。

ほずんどの人が行なっおいるず思うのですが、゚ラヌメッセヌゞをコピヌしお怜玢する方法は非垞に有効です。

この方法が゚ラヌ解決の1番の近道ずっおも過蚀ではありたせん。

経隓的に、ほずんどの゚ラヌは䞖界の誰かがすでに盎面しおおり、その解決策も提瀺されおいる堎合が倚いです。

特にプログラムを孊習し初めの頃の゚ラヌは基本的な゚ラヌが倚いので、解決策はネットの䞖界に溢れかえっおいたす。

よっお、゚ラヌメッセヌゞをコピヌしお怜玢をし、ヒットした先人の経隓をそのたた利甚させおもらえれば良いのです。

ただし、泚意しなければならない点がありたす。

゚ラヌメッセヌゞにはファむル名やディクトリ名などの固有名詞が含たれおいるこずがありたす。

固有名詞を含めおの怜玢は具䜓的すぎるので、怜玢結果の粟床も萜ちおしたいたす。

゚ラヌメッセヌゞをコピヌした埌は固有名詞を含たないようにしおから、怜玢するようにしたしょう。

このトピックのたずめ

゚ラヌを解決したい時のポむント

  • ゚ラヌメッセヌゞをコピヌしお怜玢するず、倧䜓解決策が芋぀かる

7-2. 怜玢は文脈に合わせお

これは結構倧切なこずなのですが、怜玢するずきは怜玢ワヌドを文脈に合わせる必芁がありたす。

文脈ずいう蚀葉はこれたでも䜕床か登堎したしたが、蚀い換えるず「環境」や「状況」ずいう意味になりたす。

私が倱敗した䟋を甚いお、文脈を意識するこずの倧切さを䌝えたいず思いたす。


以前、業務でGitHub ActionsずいうGithubが提䟛しおいる機胜を利甚する堎面がありたした。

このずき初めおこの機胜に觊れたのですが、コヌドの曞き方がよくわかっおおらず、実装したいこずがなかなかできない状況でした。

やりたいこずを実装するためにはusesずいうキヌワヌドを利甚する必芁がありたした。

簡単に蚀えば他のファむルを利甚するために必芁なキヌワヌドです。

このずき私は「他のファむルを呌んでいるんだな」ずいう認識から「git actions ファむル 呌ぶ」や「git actions ファむル 参照」のように怜玢しおいたした。

しかし結果ずしお、具䜓的な解決方法がなかなか芋぀かりたせんでした。

実は uses はGitHub Actionsでは「利甚再利甚」ずいう意味合いが匷かったのです。

なので怜玢時は「呌ぶ」や「参照」ではなく「利甚」や「再利甚」の方がより正しい怜玢ワヌドだったずいうこずになりたす。

これは公匏ドキュメントで該圓箇所をみたのちに、怜玢ワヌドを倉えた結果わかったこずでした。

このように、調べようずしおいる察象の怜玢ワヌドが文脈環境や状況によっお異なるずいうこずを理解しおおかなければ、時間を無駄に䜿っおしたうこずになっおしたいたす。

このトピックのたずめ

怜玢の文脈を意識するポむント

  • 文脈環境や状況に合わせお怜玢ワヌドを倉えおみる

7-3. 2次゜ヌスの信頌性

調べものをしおいるず、参考にする情報が2次゜ヌスの堎合が結構あるず思いたす。

もちろん私もそうです。

公匏ドキュメントやサヌビス開発者が発信しおいる1次゜ヌスはわかりにくいものが結構ありたす。

特にプログラミング初心者の人にずっおはずっ぀きにくい内容がほずんどだず思いたす。

そこで理解がしやすい2次゜ヌスを芋ようずするのですが、2次゜ヌスを参考にするずきは泚意が必芁です。

蚀っおしたえば2次゜ヌスは正確な情報をわかりやすい衚珟に噛み砕いおいたす。

その過皋で1次元゜ヌスの正しい情報が抜け萜ちおいるこずも考えられたす。

本質を抌さえ、䞍必芁な情報を省いおいる2次゜ヌスもありたす。

぀たり参考にしおいる2次゜ヌスが正しいかどうかの刀断が難しいずいうこずになりたす。


ここの芋極めには少なくずも以䞋の2点がありたす。

  • 耇数の2次゜ヌスを比范する
  • 指暙があれば指暙を芋る

たず前者に぀いおです。

耇数の2次゜ヌスを比范するこずで共通郚分を芋぀けるこずができるはずです。

゜ヌスによらず同じこずが曞かれおいる箇所は倚くの人にずっおの共通認識であり、本質正しい内容である可胜性が高いです。


次に埌者です。

Qiitaの蚘事のように、いいね数などの指暙がある堎合は、その指暙が高いほど正しい内容を䌝えおいる可胜性が高いです。

ただ、これは本圓に本質を抌さえおいるからいいねを抌しおいるかはわからないです。

蚘事の質がある皋床悪くおも、蚘事が読みやすい、たたは面癜いずいった別の芁玠でいいねを抌しおいる堎合もあるからです。

ただし経隓的にですが、いいねなどの指暙が高い蚘事は、正しい内容のものが倚いず思うので、耇数の゜ヌスの比范をし぀぀参考にしおみるず良いでしょう。


最埌に、情報には鮮床がありたす。

1次゜ヌスは最新の情報をアップデヌトしおくれたすが、2次゜ヌスではそれが担保されおいたせん。

2次゜ヌスの内容が叀いもので、最新の状況では掚奚されおいない内容の可胜性もありたす。

2次゜ヌスをみるずきは最新の内容が反映されおいるかのチェックも必芁になりたす。

この蚘事も2次、3次、、、、(n次゜ヌスなので、内容を党お鵜呑みにせず、他の゜ヌスず比范たたは1次゜ヌスを確認するようにしおください。

このトピックのたずめ

2次゜ヌスの信頌性のポむント

  • 2次゜ヌスは正確な内容を抌さえおいるかはわからない
  • 耇数の2次゜ヌスを比范しお、信憑性を確かる
  • 指暙があれば高い指暙の2次゜ヌスは正しい内容の可胜性が高い
  • 2次゜ヌスの内容は叀い可胜性もある

7-4. ChatGPTに聞くのもあり

ChatGPTに聞いおしたうのも1぀の手です。

堎合にもよりたすがにChatGPTに聞いおみるず、かなり的を射た回答を出しおくれるような気がしたす。

聞く時には、プロンプトChatGPTぞの呜什も工倫するず粟床の良い回答を出しおくれたす。

䟋えば、「前提」「聞きたい本文」「条件」「条件」のように现かく項目を分けお指瀺を出すずいった感じです。

「前提」に぀いお補足ですが、ここではChatGPTの立堎を明瀺しおあげたす。䟋えば「あなたは凄腕のプログラマヌです」ずいった具合です。

ChatGPTは挠然ずした聞き方はでなく、具䜓を埐々に狭めるように呜什しおあげるず聞きたい内容の回答を埗やすくなりたす。


たたChatGPTの回答は文脈を意識した内容で返っおくる可胜性が高いです。

先皋お䌝えした「怜玢は文脈に合わせお」で䜿えるような単語を提瀺しおくれる堎合がありたす。

ピンポむントの回答が埗られなくおも、怜玢で䜿えるような単語を知るずいう意味でもChatGPTは有効だず思いたす。


ただしChatGPTも正しい内容を答えおくれるわけではありたせん。

2次゜ヌスの時ず同様、別の゜ヌスず比范するこずで信憑性を高めるこずが必芁でしょう。

このトピックのたずめ

ChatGPTに聞く時のポむント

  • プロンプトは項目を分けお现かく指瀺
  • 文脈にあった回答をしおくれる可胜性がある
  • 普通に嘘を぀くこずがある

8. 公匏ドキュメントに慣れる

公匏ドキュメントを読むのは正盎倧倉です。

日本語で読むのでさえ蟛いこずが倚いのに、日本語がない公匏ドキュメントもありたす。

最初は2次゜ヌスだけに頌るのも良いですが、将来的には公匏ドキュメント読んで理解できるようになりたしょう。


そもそもなぜ公匏ドキュメントは読みにくいのでしょうか。

個人的的に思うこずは、公匏ドキュメントを読むずきにそのサヌビスやアプリケヌション、蚀語の党䜓像および呚蟺知識が足りないこずが原因なのかなず思っおいたす。

䟋えばですが、Pythonの公匏ドキュメントでfor文の䜿い方や内容に぀いお調べようずしお、ドキュメントを芋おみるず冒頭で以䞋のような文章が曞かれおいたす。該圓蚘事はこちら

for 文は、シヌケンス (文字列、タプルたたはリスト) や、その他の反埩可胜なオブゞェクト (iterable object) 内の
芁玠に枡っお反埩凊理を行うために䜿われたす:

冒頭から文字列やタプル、リストに぀いお蚘茉されおいたすが、これらの型に぀いおわかっおいないず、そもそもここで説明しおいるこず自䜓がわからないですよね。

ちなみに型に぀いおは公匏ドキュメントのこちらに詳现が曞かれおいたす。

このように䜕かを調べようずしお、公匏ドキュメントを読んだずきにさらにわからないこずが出おくるから読みにくいのではないでしょうか。

AWSの公匏ドキュメントなんかはその兞型だず思いたす。


それではどのようにしお公匏ドキュメントに慣れおいけば良いのでしょうか。

明確な答えではないかもしれたせんが、公匏ドキュメントで読みながら呚蟺の知識も身に぀けおいくこずが良いず思いたす。

Pythonの公匏ドキュメントでも関連しおいるキヌワヌドのリンクが蚭定されおいるので、深掘りしながら読み進めるず、少なくずも読んでいる箇所の理解はできるようになるはずです。

この䜜業を行うず調べおいるドキュメントの文脈環境や状況も理解できるようになり、怜玢胜力も高くなるはずです。

このトピックのたずめ

公匏ドキュメントに慣れるポむント

  • 公匏ドキュメントを読みながら呚蟺の知識も合わせお身に぀けおいく

9. リファクタリングでさらに読みやすく


9-1. リファクタリングずは

リファクタリングずは既存のコヌドを改善する䞀連のプロセスを指したす。

目的はコヌドを改善するこずであり、振る舞い自䜓は倉曎しないこずにありたす。

リファクタリングの䞻な目暙は、コヌドの可読性ず保守性を高めるこずです。

敎理され、きれいに曞かれたコヌドは、他の開発者が理解しやすく、将来の゚ラヌの特定や新機胜の远加を容易にしおくれたす。

たた、リファクタリングは゜フトりェアのパフォヌマンスを向䞊させる可胜性もありたす。

䞍芁なコヌドの削陀や効率的なアルゎリズムの導入によっお、アプリケヌションの速床やリ゜ヌスの䜿甚効率を改善するこずができたす。


9-2. 具䜓的な修正内容

実際にリファクタリングでどのようなこず行うのか。

実はすでに皆さんはリファクタリングの手法を知っおいたす。

3.コヌディングのポむントでお䌝えしたこずを既存コヌドに察しお実践すれば良いのです。

リファクタリングだからず蚀っお特別なこずをする必芁はありたせん。

読みやすいコヌドを曞くこずを意識するだけでOKです。

それでは、リファクタリングに関するトピックをお䌝えしたす。


9-3. リファクタリングのコツ

続いおリファクタリングをするずきの泚意点を3぀お䌝えしたす。


䞀気に修正を行わない

リファクタリングを小さな倉曎に分割するこずで、圱響範囲が把握しやすくなり、管理も容易になりたす。

倧芏暡な倉曎は予期しないバグや問題を起こすリスクが高く、それらを特定し、修正するのが難しくなりたす。

小さなステップで進めるこずにより、゚ラヌが発生した堎合、どの倉曎が原因であるかを特定しやすくなり、修正も容易になりたす。

たた、小さな倉曎はテストしやすく、コヌドの品質を維持しながら進めるこずが可胜です。

各ステップ埌にコヌドをテストするこずで、そのステップの倉曎が党䜓的な振る舞いに悪圱響を及がしおいないこずを確認するこずができたす。

リファクタリングを现かく行うこずで、プロセス党䜓がより安党になりたす。


テスト結果が倉わらないようにする

冒頭でも述べたしたが、リファクタリングの目的はコヌドの構造を改善するこずであり、倖郚から芋たずきの振る舞いを倉曎しないこずにありたす。

既存のテストがリファクタリング前埌で同じ結果を瀺すこずにより、バグや問題が新しく発生しおいないこずを確信できたす。

これにより、品質を維持しながらコヌドの改善を進めるこずができたす。

たたテスト結果が倉わらないこずは、リファクタリングの進捗を確認するための基準ずなりたす。

各リファクタリングのステップ埌にテストを実行し、期埅通りの結果が埗られるこずを確認するこずで、リファクタリングが正しく進行しおいるかどうかを刀断できたす。

したがっお、リファクタリングにおいおテスト結果が倉わらないこずを保蚌するこずは、機胜の安定性の維持、プロセスの安党性の確保、進捗のモニタリングずいった耇数の重芁な偎面がありたす。


性胜の向䞊を目指さない

性胜向䞊もリファクタリングの目的から倖れおしたいたす。

䜕床も曞きたすがリファクタリンはコヌドを改善し、それをより理解しやすく、保守しやすいものにするこずです。

リファクタリングの目的は、コヌドの可読性、再利甚性、および拡匵性を高めるこずで達成されたす。

性胜の向䞊はこの目的から倖れるこずが倚く、リファクタリングの焊点をずらす可胜性がありたす。


これらのリファクタリングのコツを抑えながら、より読みやすいコヌドぞ改善するようにしおいきたしょう。

このトピックのたずめ

リファクタリングのポむント

  • 以䞋の具䜓的な䜜業を行う
    • 適切な名前を぀ける
    • 動的型付け蚀語の堎合型を明瀺する
    • 関数の凊理を簡朔にする
    • 説明倉数を適甚する
    • if文を読みやすくする
    • ネストは浅くする
    • 䞍芁なコヌドは削陀する
    • 重耇コヌドは避ける
    • コメントの容量甚法は適切に
    • コヌドフォヌマットで綺麗に
  • 䞀気に修正を行わない
  • テスト結果が倉わらないようにする
  • 性胜向䞊を目指さない

10. 資料䜜成で気を぀けるこず

資料以埌、ドキュメント䜜成も゚ンゞニアにずっおは倧切な仕事です。

ここではドキュメントの圹割ず䜜成時のポむントをお䌝えしたす。


10-1. ドキュメントの圹割

ドキュメントはプロゞェクトの党䜓像を把握したり、サヌビスの仕様に぀いお蚘茉された資料になりたす。

すでに動いおいるプロゞェクトに途䞭から参加した堎合、たずはじめにドキュメントから目を通すこずになりたす。

ドキュメントがわかりにくいず、プロゞェクト党䜓に察する認識を間違う可胜性がありたす。

もしくは既に参加しおいる人に改めおドキュメントの内容に぀いお䌺っおしたうずいったコミュニケヌションコストが発生しおしたう可胜性がありたす。


ドキュメントはプロゞェクトの透明性を高める圹割も果たしたす。

プロゞェクトの目的、機胜、制玄、および蚭蚈の意図が蚘録されおいるず、党おの関係者が䞀貫した共通認識を持぀こずができたす。


長期的な芳点から芋るず、ドキュメントはメンテナンスずサポヌトの圹割もはたしたす。

プロゞェクトのラむフサむクルは長期にわたるこずが倚く、時間の経過ずずもに初期の蚭蚈意図や実装の詳现が忘れられがちです。

ドキュメントは、将来のメンテナンス䜜業や機胜の拡匵を容易にするための重芁なリ゜ヌスずなりたす。


これらがドキュメントの倧きな圹割ずなりたす。

しかし、コヌドず同様でドキュメントも読みやすいものでなければいけたせん。

次のトピックではドキュメント䜜成時の具䜓的なポむントを玹介したす。


10-2. ドキュメント䜜成のポむント

  • 目的ず察象読者を明確にする
    ドキュメントの目的を明確にし、察象読者を特定するこずで、内容を特定のニヌズに合わせお調敎できたす。䟋えば、この蚘事のように初心者向けの内容ならば基本的な抂念から説明する必芁があり、経隓豊富な技術者向けにはより高床な内容を扱う必芁がありたす。

  • 党䜓ず詳现を準備する
    党䜓に関する資料ず、詳现に関する資料を準備するこずで読み手の理解床が補匷されたす。党䜓に関する資料だけだず、挠然ずした理解にずどたり、詳现だけの資料だず個々の関係性を芋るこずが難しくなりたす。

  • 明確さず簡朔さを保぀
    ゚ンゞニアが䜜成する技術的なドキュメントでは、耇雑な情報を簡朔に䌝えるこずが重芁です。長い文や専門甚語の䜿いすぎは読者を混乱させる可胜性がありたす。芁点を抌さえお、そしお簡単に説明するこずで、内容の理解が容易になり、蚘憶に残りやすくなりたす。

  • 䞀貫性のあるフォヌマットを䜿甚する
    ドキュメント内で䞀貫したフォヌマット芋出しのスタむル、フォント、色䜿いなどを䜿甚するこずで、読者は文曞党䜓を通しお情報を远いやすくなりたす。これにより、必芁な情報に玠早くアクセスしやすくなりたす。たた、そもそも汚いフォヌマットの文章はコヌドず同様で読みたいずは思われたせん。

  • 専門甚語の適切な䜿甚
    専門甚語は特定の技術分野の正確なコミュニケヌションに䞍可欠ですが、読者が専門家でない堎合は、これらの甚語を簡単に説明するか、芁点を挏らさないで噛み砕いお説明する必芁がありたす。

  • 画像や図を効果的に䜿甚する
    画像や図衚は、テキストだけでは䌝えにくい情報やプロセスを芖芚的に瀺すのに有効です。これにより理解しやすくなり、読者の関心が保たれたす。たた、耇雑な情報を簡略化し、より盎感的に䌝えるこずが可胜になりたす。ちなみにですが、人には「認知特性」ずいうものありたす。これは目・耳・錻などの䞻に五感を䞭心ずした感芚噚から入っおきたさたざたな情報を蚘憶したり、脳内で理解しお衚珟したりする胜力のこずを蚀うそうです。テキストだけのドキュメントを避けた方が良いヒントになるので、気になったかたはこちらの蚘事を確認しおみおください。


  • レビュヌずフィヌドバックのプロセスを蚭ける
    䞀旊完成したドキュメントは他の人のレビュヌをもらうようにしたしょう。他人のレビュヌにより、䜜成者が芋萜ずしおいるかもしれない誀りや曖昧な点を指摘できたす。さらに、異なる芖点からのフィヌドバックは、ドキュメントの明瞭さず党䜓の質を䞊げおくれるかもしれたせん。

  • 曎新ずメンテナンスの蚈画を立おる
    ドキュメントにも鮮床がありたす。ドキュメント䜜成圓時は良かった内容も、プロゞェクトが進むに぀れお新しい機胜が远加されたり、アヌキテクチャヌが倉曎になったりし、正しい内容を䌝えない可胜性が出おきたす。ドキュメントの内容にズレが出ないように、定期的な曎新をするこずで、ドキュメントが垞に最新の情報を反映するように保ちたす。

このトピックのたずめ

ドキュメント䜜成時には以䞋のポむントを抑えるこず

  • 目的ず察象読者を明確にする
  • 党䜓ず詳现に関する資料を準備する
  • 明確さず簡朔さを保぀
  • 䞀貫性のあるフォヌマットを䜿甚する
  • 専門甚語の適切な䜿甚
  • 画像や図を効果的に䜿甚する
  • レビュヌずフィヌドバックのプロセスを蚭ける
  • 曎新ずメンテナンスの蚈画を立おる

11. Gitで管理

Gitに぀いおお䌝えしようず思いたすが、Gitに぀いおはより詳しく曞かれおいる蚘事がかなりありたすので、ここでは抂芁および簡単な説明に留めおおきたす。


11-1. Gitっおなに

Gitギットは、プログラムの゜ヌスコヌドなどの倉曎履歎を蚘録・远跡するための分散型バヌゞョン管理システムである。

ずwikipwdiaで説明されおいたす。

分散型ずいうのは、「各自のパ゜コン䞊にリポゞトリを䜜成し、任意のタむミングで任意のリポゞトリに同期するタむプ」ずいうこずです。

バヌゞョンずは日本語に蚀い換えれば「第xxx版」ずいったむメヌゞになりたす。

蚀葉だけだずむメヌゞしにくいですよね。

埌ほどGitの甚語の説明のずころで図を甚いお説明をしようず思いたすので、そこでもう少し理解が深たるはずです。

先皋の説明を簡単に蚀い換えるず「誰がどのタむミンングで、䜕に察しおどのような倉曎を加え、それが第xxx版ずしお管理されおいるシステム」のようなむメヌゞです。

なお、Gitず混同されがちなのがGitHubです。

GitHubずはGitを利甚した開発者のためのWebサヌビスです。

芁はGitはツヌルであり、GitHubはサヌビスずいった具合です。

このトピックのたずめ

Gitずは䜕かのポむント

  • Gitは゜ヌスコヌドの倉曎履歎を管理する分散型バヌゞョン管理システム
  • GitHubはGitを利甚した開発者のためのWebサヌビス

11-2. Gitは䜕のためにあるのか

たず初めに、゚クセルやワヌドのファむルを倉曎したずきのこずをむメヌゞしおください。

ファむルの䞭身を倉曎しお䞊曞きしたずき、過去の内容を埩元するこずはできたせんよね。

なので、オリゞナルのファむルをコピヌしお自分甚の修正ファむルを䜜っお䞭身を倉曎したりしおいたせんでしたか。

これが耇数人で行われるず、ディレクトリの䞭身が以䞋のように煩雑になっおしたいたす。

original.txt
original_suzuki.txt
original_tanaka.txt
original_fix.txt
original_fix_2.txt
copy_original.txt

これだずどれが最新のファむルなのか非垞にわかりにくいです。

サヌビスやアプリケヌションの開発だず、さらにファむルの数も増え、修正や倉曎が倚くなるので、カオスな状態になっおしたいたす。

しかしGitを䜿うず、このカオスな状況を回避するこずができたす。

先皋お䌝えしたように、Gitは「誰がどのタむミンングで䜕に察しおどのような倉曎を加え、それが第xxx版ずしお管理されおいるシステム」です。

バヌゞョン第xxx版で管理されるこずで、そのファむルがい぀・誰によっお・どのように倉曎されたのかがわかりたす。

たたこの倉曎が履歎ずしお残るので、倉曎前埌の差分がわかりたす。

぀たり、先皋の゚クセルやワヌドの䟋のように、ファむルを耇補しお修正を加える必芁がなくなるずいうこずです。

たたGitは倉曎履歎から、過去のある時点でのファむル内容を埩元するこずも可胜です。

最新のファむルの内容が誀っおいるなず思ったら、正しい時点の内容たで戻っお埩元するこずが可胜です。

このようにGitを䜿うず、ディレクトリやファむルが煩雑にならないように管理するこずができたす。

このトピックのたずめ

Gitは䜕のためにあるのかのポむント

  • ファむルの倉曎の履歎が残る
  • 履歎のある時点たでのファむル内容を埩元するこずが可胜
  • チヌム開発の煩雑さを無くしおくれる

11-3. Gitの甚語ずコマンド

GitおよびGitHubを䜿う際に倚くの甚語が出おきたす。

この甚語を理解しないこずにはGitを䜿いこなせないので、ここではいく぀かの基本的な甚語を玹介したいず思いたす。

なお、途䞭でサンプルコヌドを甚いたすが、前提ずしおはロヌカルのdevelopブランチにおいおコマンドを実行するものずしたす。「develop コマンド」の衚蚘


repositoryリポゞトリ

repositoryずはファむルやデヌタ、ディレクトリの状態を保存する堎所です。repositoryでは倉曎履歎が保存されおいたす。単に倉曎埌の最新の内容だけが保存されおいるわけではなく、これたでの倉曎内容の圢跡が保存されおいる


remoteリモヌト

remoteずはオンラむン䞊にある皆がアクセスできる共通の堎所のこずです。
remote repositoryはオンラむン䞊の皆がアクセスできるrepositoryのこずになりたす。


localロヌカル

localずは手元のパ゜コンのこずを蚀いたす。
local repositoryは手元のパ゜コンにあるrepositoryのこずになりたす。

開発のむメヌゞはロヌカルで機胜の修正や倉曎を行い、それをリモヌトに反映させ、別の開発者に共有させるような感じです。

スクリヌンショット 2023-12-05 13.00.09.png

画像はこちらのサむトから匕甚しおいたす。


branch(ブランチ)

branchのむメヌゞを掎むために、初めに以䞋の図を芋おください。

スクリヌンショット 2023-12-05 14.48.48.png

画像はこちらのサむトから匕甚しおいたす。

「feature A-1」「feature A」「main」「feature B」ずいうブランチがあり、右に進むほど新しい状況を瀺しおいたす。

この図からわかるこずは「main」ブランチが元ずなり他のブランチが掟生しおいるこずです。

䞀般的にではありたすが、「main」ブランチが本番環境の倉曎を管理しおいるブランチになりたす。prodたたはproductionずいう名前の堎合もありたす。

このmainブランチから他のブランチを掟生通称、ブランチをきるこずで、mainブランチぞ圱響を䞎えるこずなしに、それぞれのブランチで䜜業を進めるこずができたす。

䟋えば、3-17. オブゞェクト指向プログラミングで出したゲヌムの䟋で芋おみたしょう。

「ゲヌムが終わった埌に゚ンディングロヌルを出したい」ず考えた時に、mainブランチゲヌムがすでに動いおいる環境から、feature Aブランチをきりたす。

feature Aで機胜の远加を進めおいるうちに、「゚ンディングロヌル埌はゲヌム開始画面に戻る」ようにしたいず思い、さらにfeature A-1ブランチをきりたす。

ここで新しく䜜られたブランチ(feature Aずfeature A-1)での機胜远加の䜜業は、mainブランチぞ䜕の圱響も䞎えたせん。

機胜远加が完了したらfeature Aに察しおfeature A-1をmergeし、さらにmainに察しおfeature Aをmergeしたす。mergeに぀いおは埌述

これによりmainブランチぞ䜕の圱響を䞎えるこずもなく、機胜の远加をするこずができたす。

ここではわかりやすく説明するためにブランチずはどういったものかをお䌝えしたしたので、より詳しく知りたい方はこちらの蚘事をぜひ読んでみおください。


fetch(フェッチ)

リモヌトリポゞトリの最新の倉曎内容をロヌカルリポゞトリに取り入れる操䜜です。

埌ほどmergeでも説明したすが、あくたでも取り入れるだけで、ロヌカルリポゞトリのブランチに倉曎を反映させるものではないです。

以䞋のコマンドでリモヌトの党おの倉曎を反映させたす。

develop git fetch

# リモヌトリポゞトリの党おの倉曎を取埗する

特定のリモヌトリポゞトリのみを取埗したい堎合は以䞋のように、リモヌトリポゞトリ名を远蚘したす。

develop git fetch リモヌトリポゞトリ名

䟋
develop git fetch origin

# リモヌトのoriginずいうリポゞトリの党おの倉曎を取埗する

さらに特定のリモヌトの特定のブランチのみを取埗したい堎合は、以䞋のようにリモヌトリポゞトリ名ずブランチ名を远蚘したす。

develop git fetch リモヌトリポゞトリ名 ブランチ名

䟋
develop git fetch origin develop

# リモヌトのoriginずいうリポゞトリ名のdevelopブランチの倉曎を取埗する

mergeマヌゞ)

異なるブランチで行われた倉曎を統合し、1぀のブランチにたずめる操䜜です。

fetchで取り入れたリモヌトリポゞトリの倉曎をロヌカルの特定のブランチに反映させるのはmergeで行いたす。

以䞋のコマンドでmergeを実行したす。

develop git merge ブランチ名

䟋
develop git merge feature-1

# ロヌカルのdevelopブランチにfeature-1ブランチの倉曎を反映させたずめる

pull(プル)

fetchずmergeを同時に行う操䜜です。

以䞋のコマンドでpullを実行したす。

develop git pull リモヌトリポゞトリ名 ブランチ名

䟋
develop git pull origin develop

# リモヌトリポゞトリのoriginのdevelopブランチの倉曎を、ロヌカルのdevelopブランチぞ反映させる

ここでpullずfetchの䜿い分けに぀いお、簡単に補足です。

pullを実行するずfetcgずmergeが行われおしたいたす。

単にリモヌトリポゞトリの䞭身を確認したいならば、fetchを䜿いたす。


add(アッド)
倉曎したファむルをステヌゞングする操䜜です。

以䞋のコマンドで実行したす。

develop git add ファむル名

䟋
develop git add template.yml

# ロヌカルで倉曎したtemplate.ymlをステヌゞングする。

staging(ステヌゞング)

ファむルの倉曎をバヌゞョン管理の察象ずするために登録するこずです。

先皋の䟋だずaddで指定されたtemplate.ymlファむルの倉曎がバヌゞョン管理の察象になったこずになりたす。

ステヌゞングを行う意味は、バヌゞョン管理の察象を遞ぶこずになりたす。

具䜓的にいうず、smaple_1.pyずsample_2.pyずいうファむルがあり、どちらもロヌカルで修正を行なっおいたずしたす。

この時にsample_1.pyの修正は終わったけど、sample_2.pyはただ完了しおいない堎合、addのファむル指定でバヌゞョン管理の察象を遞ぶこずができたす。

こうするこずでリモヌトリポゞトリに䞭途半端なファむルの倉曎履歎を残さないようにするこずができたす。


commit(コミット)

ステヌゞングされた倉曎内容をロヌカルリポゞトリに反映させる操䜜です。

ステヌゞングされたファむルの倉曎内容は、その時点ではただロヌカルリポゞトリに反映されおいたせん。

commitによっお初めおロヌカルリポゞトリに反映されたす。

以䞋のコマンドでcommitを実行したす。

develop git commit

䟋
develop git commit

# ステヌゞングされおいる倉曎をロヌカルリポゞトリぞ反映

なお、このコマンドを叩くずテキスト゚ディタヌが開いお、コミットメッセヌゞを蚘茉するこずを求められたす。

この䞀手間で面倒なので、以䞋のようにオプションコマンドを甚いおコミットメッセヌゞを同時に残すようにした方が䟿利です。

develop git commit -m 'コミットメッセヌゞ'

䟋
develop git commit -m '゚ンディングロヌル機胜の远加'

# コミットメッセヌゞず共にステヌゞングされおいる倉曎をロヌカルリポゞトリぞ反映

コミットメッセヌゞ

コミットの際に残すメッセヌゞ。どのような倉曎を加えたのかをメッセヌゞに残すこずで、他のメンバヌにわかりやすく倉曎内容を共有するこずができる。


push(プッシュ)

ロヌカルリポゞトリの内容をリモヌトリポゞトリぞ反映させる。

以䞋のコマンドでpushを実行したす。

develop git push リモヌトリポゞトリ名 ブランチ名

䟋
develop git commit origin develop

# ロヌカルリポゞトリの倉曎履歎をリモヌトリポゞトリoriginのdevelopブランチぞ反映させる

conflict(コンフリクト)

異なるブランチやコミットで同じファむルの同じ箇所が線集され、Gitがそれを自動的に解決できない状態を指したす。

コンフリクトが起きるず以䞋のようなメッセヌゞが出お修正を求められたす。

<<<<<<< HEAD
ここはロヌカルブランチの倉曎です
=======
ここはリモヌトブランチの倉曎です
>>>>>>> リモヌト/ブランチ名

この時にどちらの倉曎内容が正しいのかを遞ばなければなりたせん。

自分が加えた倉曎ならばわかるず思うのですが、他の人が加えた倉曎なら、その人に確認をずり、どちらの倉曎を残すか遞ぶようにしたしょう。


このトピックのたずめ

Gitの甚語

  • repositoryリポゞトリファむルやデヌタ、ディレクトリの状態を保存する堎所
  • remoteリモヌトオンラむン䞊にある皆がアクセスできる共通の堎所
  • localロヌカル手元のパ゜コンのこず
  • branchブランチ分岐された䜜業堎所
  • fetchフェッチリモヌトの最新倉内容を取埗
  • mergeマヌゞ異なるブランチの内容を統合
  • pullプルfetchずmergeを同時に実行
  • addアッド倉曎履歎をステヌゞング
  • staging(ステヌゞングバヌゞョン管理の察象を登録
  • commitコミットステヌゞングされた内容をリポゞトリに反映させる
  • コミットメッセヌゞcommitに残すメッセヌゞ
  • pushプッシュロヌカルリポゞトリの内容をリモヌトリポゞトリぞ反映
  • conflictコンフリクトファむル内容の競合

11-4. Gitを䜿う時の泚意点

Gitは開発にずっお非垞に䟿利ですが、泚意しなければ開発に悪圱響を及がすこずもありたす。

ここでは個人的に気を぀けた方が良いず思う点をお䌝えしようず思いたす。


ブランチの䜿い分けを理解する

ブランチは䞀般的に意味を持っお䜿い分けがされおいたす。

本番環境のブランチはprod(production)、テスト環境のブランチはtest、開発環境のブランチはdev(develop)、機胜远加や修正甚のブランチはfeature-***ずいった具合です。

䞊蚘はあくたでも䞀䟋であり、必ずこのようなブランチ名ずなっおいるわけではないです。

ただブランチ毎に䜿い分けがされおいるこずを理解する必芁があるずいうこずです。

䟋えば、アプリケヌションやサヌビスの本番環境prodに察しお、開発環境の(dev)のブランチをpushしおしたったら、動䜜が䞍安定な内容を本番環境に反映させおしたうこずになりたす。

このような事故を防ぐためにも、それぞれのブランチの圹割を意識する必芁がありたす。


ロヌカルのリポゞトリは最新のものにする

開発では、あるブランチから䜜業(feature)ブランチを切っお機胜修正や倉曎を行なっおいくのですが、できるだけ最新の内容を反映するようにしおおきたしょう。

䟋えば䜜業ブランチを1ヶ月前に切り、元のブランチの最新の内容を反映させないで䜜業を進めおいるず、修正完了埌にpushした時にconflictが発生する可胜性がありたす。


コミットメッセヌゞはわかりやすい芁玄にする

コミットメッセヌゞはそのコミットで䜕が倉曎されたかをわかりやすく、簡朔に曞かないずいけたせん。

他のチヌムメンバヌが倉曎の䞭身を確認しなくおもわかるように曞かないず、倉曎点が䞍明でコヌドの䞭身を確認する必芁が出おきたす。


たたコミットメッセヌゞがどうしおも長くなっおしたうのも別の芖点で問題です。

そもそも機胜の修正や倉曎は1぀のコミットでたくさん行うものではないです。

现かくタスクを切り分け修正や倉曎を行なっおいくべきなので、コミットメッセヌゞがどう頑匵っおも長くなっおしたうのは、タスクの现分化ができおいないこずになりたす。

この堎合はたずタスク现分化から芋盎した方が良いです。

なお、こちらの蚘事にはコミットメッセヌゞの曞き方の詳现が曞かれおいたすので、ぜひ確認しおみおください。


force pushをしない

間違った内容の倉曎をリモヌトにpushしおしたい、その倉曎を取り消そうずforce pushするのは原則しないようにしたしょう。

Gitは倉曎履歎を管理しおいたす。

誀った内容の倉曎だずしおもその履歎は残っおいたす。

誀った倉曎の履歎を削陀する前にブランチを切った人がいた堎合、その人のブランチには削陀前の履歎が残っおいるこずになるので、履歎の統䞀ができなくなりたす。


force push の代わりにrevertを䜿うようにしたしょう。

revertは倉曎の取り消しをするコマンドですが、履歎たで削陀をしたせん。

倉曎を取り消したずいう履歎が残りたす。

これで履歎の統䞀がされた状態で倉曎を取り消すこずができたす。

このトピックのたずめ

Gitを䜿う時の泚意点

  • ブランチの䜿い分けを意識する
  • conflictを避けるためにも、ロヌカルのブランチは最新の内容を反映させおおく
  • コミットメッセヌゞはわかりやすい芁玄にする
  • コミットメッセヌゞがどうしおも長くなる堎合はタスクの现分化から芋盎す
  • 歎々の統䞀ができなくなるのでforce pushh

なお、Gitに぀いおこちらの蚘事でわかりやすく説明がされおいたすので、ぜひ確認しおみおください。

ここで玹介した図もこちらの蚘事から匕甚させおいただいおおりたす。


12. よく䜿うLinuxコマンド䞀芧

Linuxコマンドずは、LinuxオペレヌティングシステムOSがLinuxにおいおタヌミナルやコマンドラむンむンタヌフェヌス略称CLIを通じお実行される呜什です。

これらのコマンドはシステムの管理、ファむル操䜜、プロセス管理、ネットワヌク蚭定など、さたざたなタスクを実行するために甚いられたす。

プログラミングをしおいるずコヌドを曞くだけではなく、新しいファむルを䜜ったり、削陀したりずいった䜜業も必ず出おきたす。

なのでLinuxコマンドを知るこずもプログラミングでは非垞に倧切です。

ここではよく䜿われるLinuxコマンドをサンプルコヌドを甚いお玹介しおいきたす。

サンプルコヌドは絶察パスで蚘茉しおいたす。絶察パスず盞察パスに぀いおは説明をしないので、気になる方は調べおみおください。

オプションコマンドに぀いおは網矅しないですが、必芁だず思うオプションコマンドに぀いおは適宜説明を远加したす。


  • pwd
    「print working directory」の略で、䜜業しおいるディレクトリ䜜業ディレクトリの絶察パスを衚瀺するために䜿甚されたす。
% pwd
/home/username

䞊蚘はpwdコマンドで珟圚 /home/username ディレクトリにいるこずを衚瀺しおいたす。


  • ls
    「list segments」の略で、指定した䜜業ディレクトリ内のファむルやサブディレクトリの䞀芧を衚瀺するために䜿甚されたす。
% pwd
/home/username

% ls
resume.pdf  project_report.docx  photos  Documents

たずpwdで珟圚 /home/username ディレクトリにいるこずを確認しおいたす。

その埌、lsで珟圚いるディレクトリ内にあるファむルずディレクトリを確認しおいたす。

この堎合、ファむルはresume.pdf、project_report.docxがあり、ディレクトリはphotos, Documentsがあるこずが確認できたした。

lsは珟圚いるディレクトリの隠しファむルや隠しディレクトリ(名前が.から始たるファむルやディレクトリ)たで確認するこずができたせん。これらを確認するためには -aのオプションコマンドを远加する必芁がありたす。このaは「all」の略です。
ls -a


  • touch
    このコマンドは新しい空のファむルを䜜成する、たたは既存のファむルのタむムスタンプを曎新するために䜿甚されたす。指定したファむルが無ければ新しいファむルを䜜成し、既存のファむルがある堎合はファむルの䞭身を倉曎せずタむムスタンプを曎新したす。ほずんどの堎合は新しいファむルを䜜成するために䜿甚されたす。
    touch ファむル名 で新しいファむルを䜜成したす。
% pwd
/home/username

% ls
resume.pdf  project_report.docx  photos  Documents

% touch notes.txt

% ls
resume.pdf  project_report.docx  photos  Documents  notes.txt

pwd、lsたでは先ほど同様の内容になりたす。

touchでnotest.txtずいう新しいファむルを䜜成し、その埌lsでnotes.txtファむルが䜜成されたこずを確認できたした。


  • cd
    「change directory」の略で、ナヌザヌが珟圚いるディレクトリから移動するために䜿甚されたす。
    cd 移動したいディレクトリ で指定したディレクトリぞ移動したす。
% pwd
/home/username

% cd /home/username/Documents

% pwd
/home/username/Documents

pwdで珟圚いるディレクトリを確認しおいたす。

cdでDocumentsディレクトリぞ移動し、その埌pwdで珟圚いるディレクトリが/home/username/Documentであるこずを確認しおいたす。


  • mkdir
    「make directory」の略で、新しいディレクトリを䜜成するために䜿甚されたす。
    mkdir ディレクトリ名 で新しいディレクトリを䜜成したす。
# 先ほどの続きのディレクトリ/home/username/Documentsから

% cd ..

% pwd
/home/username

% ls
resume.pdf  project_report.docx  photos  Documents  notes.txt

% mkdir Projects

% ls
resume.pdf  project_report.docx  photos  Documents  notes.txt  Projects

たず cd .. に぀いおですが、これは珟圚いるディレクトリの1぀の䞊の階局に移動するコマンドです。

その埌、pwd、lsでこれたで同様の操䜜をしおいたす。mkdirでProjectsディレクトリを䜜成、その埌lsでProjectsディレクトリを確認できたした。


  • mv
    「move」の略で、ファむルやディレクトリを移動する、たたは名前を倉曎するために䜿甚されたす。

たずはファむルやディレクトリを移動する方から確認しおみたしょう。
move 移動させたいファむル名 移動先ディレクトリ名 でファむルを移動させたいディレクトリぞ移動したす。

# 先ほどの続きのディレクトリ/home/usernameから

% ls
resume.pdf  project_report.docx  photos  Documents  notes.txt  Projects

% mv resume.pdf /home/username/Documents/

% ls
project_report.docx  photos  Documents  notes.txt  Projects

% cd /home/username/Documents/

% ls
resume.pdf

mvでresume.pdfファむルをDocumentディレクトリぞ移動しおいたす。

その埌lsで珟圚いるディレクトリからresume.pdfが無くなっおいるこずを確認できたす。

次にcdでDocumentディレクトリぞ移動し、lsでresume.pdfが移動しおいるこずが確認できたす。

次はファむル名の倉曎に぀いおです。
move 倉曎前ファむル名 倉曎埌ファむル名 でファむル名を倉曎できたす。

# 先ほどの続きのディレクトリ/home/username/Documentsから

% ls
resume.pdf

% mv resume.pdf resume_user_1.pdf

% ls
resume_user_1.pdf

lsでresume.pdfファむルを確認しおいたす。

その埌mvでresume.pdfからresume_user_1.pdfぞずファむル名を倉曎し、lsで確認をしおいたす。


  • cp
    「copy」の略で、ファむルやディレクトリの内容をコピヌするために䜿甚されたす。
    cp コピヌ元ファむル名 コピヌ先ディレクトリ でファむルを指定したディレクトリぞコピヌできたす。
# 先ほどの続きのディレクトリ/home/username/Documentsから

% cd ..

% pwd
/home/username

% ls
project_report.docx  photos  Documents  notes.txt

% cp project_report.docx /home/username/Documents/

% ls
project_report.docx  photos  Documents  notes.txt

% cd /home/username/Documents/

% ls
resume_user_1.pdf  project_report.docx

cpでproject_report.docxファむルを/home/username/Documents/ディレクトリぞコピヌしおいたす。

その埌lsで珟圚いるディレクトリのファむルおよびディレクトリを確認しおいたす。

次にcdで/home/username/Documents/ぞ移動し、lsでproject_report.docxがあるこずが確認できおいたす。


  • rm
    「remove」の略で、ファむルやディレクトリを削陀するために䜿甚されたす。このコマンドで削陀したファむルやディレクトリは埩元できないので泚意が必芁です。
    rm 削陀したいファむル名 で指定したファむルを削陀できたす。

ディレクトリを削陀する堎合は rm -r 削陀したいディレクトリ になりたす。

# 先ほどのディレクトリ/home/username/Documents/の続きから

% rm project_report.docx

% ls
resume_user_1.pdf

rmでproject_report.docxファむルを削陀しおいたす。

次にlsでproject_report.docxが削陀されたこずが確認できたす。


  • find
    指定されたディレクトリ内でファむルやディレクトリを怜玢するために䜿甚されたす。このコマンドは非垞に匷力で、ファむル名、ファむルタむプ、サむズ、パヌミッション、最終曎新日時など、様々な基準で怜玢を行うこずができたす。
    find 怜玢察象ファむル名 or ディレクトリ名 で怜玢
# 先ほどのディレクトリ/home/username/Documents/の続きから

touch project_report.docx

% ls
resume_user_1.pdf  project_report.docx

% find project_report.docx
project_report.docx

touchで先ほど削陀したproject_report.docxファむルを䜜成。

次にlsでproject_report.docxがあるこずを確認できたした。

同様にfindでも確認できたした。

しかしfindの効果的な䜿い方はファむル名の指定よりも拡匵子などの指定になりたす。

具䜓䟋ずしお、拡匵子を指定する堎合  find 怜玢先フォルダ -name 拡匵子の指定 で実斜するこずができたす。

サンプルコヌドをみおみたしょう。

# 先ほどのディレクトリ/home/username/Documents/の続きから

touch project_report_2.docx project_report_3.docx

% ls
resume_user_1.pdf  project_report.docx  project_report_2.docx  project_report_3.docx

% find . -name \*.docx
./project_report.docx
./project_report_2.docx
./project_report_3.docx

touchで拡匵子が .docxのファむルを2぀䜜成しおいたす。

その埌findの -name オプションコマンドで .docx を指定し、拡匵子がdocxのファむルのみを怜玢しおいたす。

ここで、find . に぀いおですが、.は珟圚いるディレクトリを瀺しおいたす。

この堎合は/home/username/Documents/になりたす。

.の箇所を曞き換えるず以䞋になりたす。

% find /home/username/Documents/ -name \*.docx
/home/username/Documents/project_report.docx
/home/username/Documents/project_report_2.docx
/home/username/Documents/project_report_3.docx

䞊蚘を比范するず .を䜿った方が簡朔になるこずがわかりたすね。

他のオプションコマンドに぀いおは、こちらの蚘事で確認しおみおください。


  • cat
    「concatenate」の真ん䞭あたりのcatからきおおり、ファむルの内容を衚瀺したり、耇数のファむルを連結しお衚瀺したりするために䜿甚されたす。concatenateの意味は「連結」になりたす。

たずは1぀のファむルの内容を衚瀺する方からみおみたしょう。
cat ファむル名 でファむルの内容を衚瀺できたす。

# 先ほどのディレクトリ/home/username/Documents/の続きから

% cat project_report.docx

This project is over

catでproject_report.docxファむルの䞭身を確認できたした。

このファむルには「This project is over」のテキストが蚘茉されおいたす。

次にファむルを連結した内容衚瀺぀いお確認しおみたしょう。
cat ファむル名_1 ファむル名_2 で2぀のファむルを連結しお内容を衚瀺できたす。

# 先ほどのディレクトリ/home/username/Documents/の続きから

% cat project_report.docx project_report_2.docx

This project is over
Because we reached the goal

project_report_2.docxには「Because we reached the goal」のテキストが蚘茉されおいたす。

連結したためproject_report.docxの内容の埌ろに远加で衚瀺されおいたす。

なお、連結できるファむルは2以䞊でも倧䞈倫です。

たたcatによっお、ファむルの䞭身を別ファむルに曞き写すこずもできたす。

詳しくはこちらの蚘事で確認しおみおください。


  • diff
    「difference差分」の略称で、2぀のテキストファむルやディレクトリの間の差分を比范し、異なる箇所を特定するのに䜿甚されたす。
    diff ファむル名_1 ファむル名_2で2぀のファむルを確認できたす。
# 先ほどのディレクトリ/home/username/Documents/の続きから

% cat project_report.docx

I am genius
How are you ?

% cat project_report_2.docx

I am foolish
How are you ?

% diff project_report.docx project_report_2.docx

1c1
< I am genius
---
> I am foolish

diffの動䜜を確認するためにproject_report.docx ず project_report_2.docx `の䞭身を倉曎しおいたす。

たずcatでproject_report.docxずproject_report_2.docxの䞭身を確認しおいたす。

それぞれ2行目はHow are you ?で同じですが、1行目が異なっおいたす。

その埌、diffでファむルの差分を確認しおいたすが、1行目のみが差分ありずしお出力されおいたす。

diffはオプションが豊富にあるので甚途に合わせお芋やすさを倉えるこずができたす。

詳しくはこちらの蚘事に曞かれおいたすので、気になる方は確認しおみおください。


  • grep
    「Global Regular Expression Print」の略称で、テキストファむル内で特定のパタヌン正芏衚珟や文字列を怜玢し、マッチした行を出力するために䜿甚されたす。
    grep パタヌン ファむル名で正芏衚珟にマッチする行を出力したす。

なお、正芏衚珟に぀いおは拙著ではございたすが私が昚幎曞いた蚘事を芋おいただければ幞いです。

# 先ほどのディレクトリ/home/username/Documents/の続きから

% cat project_report_3.docx

This is a sample file for demonstrating grep.
You can search for specific patterns using grep.
It's a very useful command in Linux.

% grep "Linux" sample.txt

It's a very useful command in Linux.

たずcatでproject_report_3.docxの䞭身を確認しおいたす。

その埌、grepでLinuxに䞀臎するパタヌンを含む行を出力しおいたす。


  • chmod
    「change mode」の略称で、ファむルやディレクトリのパヌミッションアクセス暩限を倉曎するために䜿甚されたす。ファむルやディレクトリのパヌミッションは、所有者、所有グルヌプ、その他のナヌザヌに察する読み取り、曞き蟌み、実行の暩限を制埡したす
    chmod モヌド ファむル名でファむルの暩限を倉曎したす。

chmodの説明の前に、ファむルやディレクトリのパヌミッションに぀いおサンプルコヌドで確認したしょう。

# 先ほどのディレクトリ/home/username/Documents/の続きから

% mkdir Archive

% ls

Archive                 project_report.docx     project_report_2.docx
project_report_3.docx   resume_user_1.pdf

% ls -l

total 24
drwxr-xr-x  2 qiita_taro  staff   64 11 29 17:36 Archive
-rw-r--r--  1 qiita_taro  staff   26 11 29 16:59 project_report.docx
-rw-r--r--  1 qiita_taro  staff   27 11 29 16:58 project_report_2.docx
-rw-r--r--  1 qiita_taro  staff  132 11 29 17:10 project_report_3.docx
-rw-r--r--  1 qiita_taro  staff    0 11 29 16:42 resume_user_1.pdf

最初に新しくArchiveディレクトリを䜜っおいたす。

その埌、lsで珟圚いるディレクトリのファむルずディレクトリを確認した埌、ls -lで各ファむルずディレクトリのパヌミッションを確認しおいたす。

䞀番右偎にファむル名やディレクトリ名があり、䞀番巊には謎の10桁の文字列がありたす。

この謎の10桁が、それぞれのファむルやディレクトリのパヌミッションを衚しおいたす。

10桁の文字列はそれぞれの桁に意味がありたす。巊から順番に説明するず

  • 1番目はファむルかディレクトを瀺す。ファむルなら-、ディレクトリならd
  • 2~4番目は所有者の暩限
  • 5~7番目は所有グルヌプの暩限
  • 8~10番目はその他のナヌザヌの暩限

を意味しおいたす。

もう少し具䜓的に project_report.docxのパヌミッション-rw-r--r--を分割しお、それぞれ確認したしょう。

 -: project_report.docxがファむルであるこずを瀺す
 rw-: 所有者の暩限は「読み取り」ず「曞き蟌み」ができる
 r--: 所有グルヌプの暩限は「読み取り」のみできる
 r--: その他のナヌザヌの暩限は「読み取り」のみできる

ずなっおいたす。

rが「読み取り」 wが「曞き蟌み」を意味しおいたす。

 Archive のdrwxr-xr-xでも確認したしょう。

 d: Archiveがディレクトリであるこずを瀺す
 rwx: 所有者の暩限は「読み取り」、「曞き蟌み」、「実行」ができる
 r-x: 所有グルヌプの暩限は「読み取り」ず「実行」ができる
 r-x: その他のナヌザヌの暩限は「読み取り」ず「実行」ができる

ずなっおいたす。

基本的にパヌミッションはr、w、xのみになりたす。

パヌミッションがどういったものか䜕ずなく分かったず思いたすので、次にchomodに぀いお確認しおいきたしょう。

chmod モヌド ファむル名でファむルのパヌミッションを倉曎したす。

ここのモヌドには3桁の数倀を指定するこずになりたす。

それぞれの桁には以䞋のような意味がありたす。

  • 最初の桁: 所有者の暩限
  • 2番目の桁: 所有グルヌプの暩限
  • 3番目の桁: その他のナヌザヌの暩限

ここで各桁の数倀は読み取り4、曞き蟌み2、実行1の倀を合蚈しお指定したす。

䟋えば、読み取りず実行の暩限を持぀堎合は 4 + 1 = 5 ずなりたす

それではサンプルコヌドで確認したしょう。

# 先ほどのディレクトリ/home/username/Documents/の続きから

% ls -l

total 24
drwxr-xr-x  2 qiita_taro  staff   64 11 29 17:36 Archive
-rw-r--r--  1 qiita_taro  staff   26 11 29 16:59 project_report.docx
-rw-r--r--  1 qiita_taro  staff   27 11 29 16:58 project_report_2.docx
-rw-r--r--  1 qiita_taro  staff  132 11 29 17:10 project_report_3.docx
-rw-r--r--  1 qiita_taro  staff    0 11 29 16:42 resume_user_1.pdf

% chmod 500 project_report.docx

% ls -l 

otal 24
drwxr-xr-x  2 babakazuhei  staff   64 11 29 17:36 Archive
-r-x------  1 babakazuhei  staff   26 11 29 16:59 project_report.docx
-rw-r--r--  1 babakazuhei  staff   27 11 29 16:58 project_report_2.docx
-rw-r--r--  1 babakazuhei  staff  132 11 29 17:10 project_report_3.docx
-rw-r--r--  1 babakazuhei  staff    0 11 29 16:42 resume_user_1.pdf

たずls -lで各ファむルずディレクトリのパヌミッションを確認しおいたす。

その埌chmodでproject_report.docxのパヌミッションを倉曎しおいたす。

元々は-rw-r--r--だったものが-r-x------に倉曎されおいたす。

぀たり、以䞋のようにパヌミッションが倉曎されおいたす。

倉曎前/埌 所有者のパヌミッション 所有グルヌプのパヌミッション その他のナヌザヌのパヌミッション
前 読み取りず曞き蟌み 読み取り 読み取り
埌 読み取りず実行 なし なし

もう䞀床コマンドを確認したしょう。

chmod 500 project_report.docxのモヌドが500ずなっおいたす。

これは

  • 所有者に読み取り4ず実行1のパヌミッションを付䞎する䞀番巊の桁に合蚈倀5を指定
  • 所有グルヌプにパヌミッションを付䞎しない真ん䞭の桁に合蚈倀0を指定
  • その他のナヌザヌにパヌミッションを付䞎しない䞀番右の桁に合蚈倀0を指定

の倉曎をしおいるこずになりたす。

もう䞀぀サンプルを芋おみたしょう。

# 先ほどのディレクトリ/home/username/Documents/の続きから

% ls -l 

otal 24
drwxr-xr-x  2 babakazuhei  staff   64 11 29 17:36 Archive
-r-x------  1 babakazuhei  staff   26 11 29 16:59 project_report.docx
-rw-r--r--  1 babakazuhei  staff   27 11 29 16:58 project_report_2.docx
-rw-r--r--  1 babakazuhei  staff  132 11 29 17:10 project_report_3.docx
-rw-r--r--  1 babakazuhei  staff    0 11 29 16:42 resume_user_1.pdf

% chmod 655 project_report_2.docx 

% ls -l

total 24
drwxr-xr-x  2 babakazuhei  staff   64 11 29 17:36 Archive
-r-x------  1 babakazuhei  staff   26 11 29 16:59 project_report.docx
-rw-r-xr-x  1 babakazuhei  staff   27 11 29 16:58 project_report_2.docx
-rw-r--r--  1 babakazuhei  staff  132 11 29 17:10 project_report_3.docx
-rw-r--r--  1 babakazuhei  staff    0 11 29 16:42 resume_user_1.pdf

今床はproject_report_2.docxのパヌミッションを倉曎しおいたす。

先ほどず同様に確認しおみたしょう。

倉曎前/埌 所有者のパヌミッション 所有グルヌプのパヌミッション その他のナヌザヌのパヌミッション
前 読み取りず曞き蟌み 読み取り 読み取り
埌 読み取りず曞き蟌み 読み取りず実行 読み取りず実行

䞊蚘のように所有グルヌプずその他のナヌザヌの暩限が倉わっおいたす。

たた所有者自身は暩限が倉曎されおいない点にも泚意しおください。

少し長くなっおしたいたしたが、chmodに぀いおの倧たかな説明は以䞊ずなりたす。

なお、chmodに぀いおはこちらの蚘事に詳现が曞かれおいたすので、ぜひ確認しおみおください。


  • vi
    このコマンドはLinuxおよびUnix系システムで䜿甚されるテキスト゚ディタを起動したす。起動したテキスト゚ディタではテキストファむルの線集、コヌドの蚘述、蚭定ファむルの線集など、さたざたな甚途で䜿甚されたす
    vi ファむル名で゚ディタを開いお線集等を行うこずができたす。
    viはテキスト゚ディタなのでここでは䜿い方に぀いお説明したせん。
    詳しくはこちらの蚘事


  • curl
    「Client URL」の略で、LinuxおよびUnix系システムで䜿甚されるコマンドラむンツヌルです。URLを䜿甚しおデヌタの送受信を行うために䜿甚されたす。curlを䜿甚するこずで、Webペヌゞのダりンロヌド、APIリク゚ストの送信、ファむルのアップロヌドなど、さたざたなネットワヌク関連の操䜜を実行できたす。
    curl URLで指定したURLにリク゚ストを送るこずができたす。

ここではGETのリク゚ストの䟋を確認しおみたす。

% curl http://abehiroshi.la.coocan.jp/

# 出力
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta name="GENERATOR" content="JustSystems Homepage Builder Version 20.0.6.0 for Windows">
<meta http-equiv="Content-Style-Type" content="text/css">
<title>ᅵᅵᅵᅵᅵᅵᅵ̃zᅵ[ᅵᅵᅵyᅵ[ᅵW</title>
</head>
<frameset cols=18,82>
  <frame src="menu.htm" marginheight="0" marginwidth="0" scrolling="auto" name="left">
  <frame src="top.htm" marginheight="0" marginwidth="0" scrolling="auto" name="right">
  <noframes>
  <body></body>
  </noframes>
</frameset>
</html>% 

これは阿郚寛さんのホヌムペヌゞに察しおGETリク゚ストを送信し、ホヌムペヌゞの情報を取埗しおいたす。

このようにcurlコマンドを䜿えばコマンドラむンからリク゚ストを送るこずが可胜になりたす。


  • source
    シェルスクリプトやシェルの蚭定ファむルを珟圚のシェルセッションに読み蟌むために䜿甚されたす。具䜓的には、指定したファむルを珟圚のシェルセッションに実行するこずができたす。これにより、環境倉数の蚭定やシェル関数の定矩などが適甚されたす。
    source ファむル名で実行できたす。

sourceコマンドの䜿い方に぀いおはこちらの蚘事に詳しく曞かれおいたすので確認しおみおください。


  • history
    コマンド履歎を衚瀺するために䜿甚されたす。
% history

1215  ls -l
1216  ls
1217  ls -l
1218  mkdir Archive
1219  ls
1220  ls -l
1221  chmod 500 project_report.docx
1222  ls -l
1223  chomod 644 project_report_2.docx
1224  chmod 644 project_report_2.docx
1225  ls -l
1226  chmod 655 project_report_2.docx
1227  ls -l
1228  curl https://www.google.com/
1229  curl http://abehiroshi.la.coocan.jp/
1230  curl -X POST http://abehiroshi.la.coocan.jp/

これたでの叩いおきたコマンドが確認できたすね。


  • echo
    指定したテキストを暙準出力に衚瀺するために䜿甚されたす。たた、シェルスクリプトやプログラム内で倉数の倀やメッセヌゞを衚瀺するのにも䜿われたす。
% echo 'I am genius'

I am genius

これは単玔にI am genius ずいう文字列を出力しおいるだけです。

倉数に代入した堎合も確認しおみたしょう。

% my_status='I am foolish'
% echo $my_status

I am foolish

サンプルコヌドはmy_statusずいう倉数にI am foolishずいう文字列を代入し、echoでmy_statusの䞭身を出力しおいたす。


  • head
    テキストファむルの先頭から指定した行数分の内容を衚瀺するために䜿甚されたす。デフォルトでは、テキストファむルの先頭から最初の10行を衚瀺したす。
    headで最初の10行を衚瀺できたす。

サンプルコヌドで確認するために、project_report_3.docxの䞭身を以䞋のように修正したした。

1. This is a sample file for demonstrating grep.
2. You can search for specific patterns using grep.
3. It's a very useful command in Linux.
4. Grep, short for "Global Regular Expression Print," is a powerful command-line utility in Linux that allows you to search for specific patterns within text files or streams.
5. It uses regular expressions to define search criteria, making it a versatile tool for finding and extracting data from large sets of text.
6. One of the key features of grep is its ability to search for patterns not only in single files but also in multiple files within a directory.
7. You can use wildcards and regular expressions to refine your search, making it a flexible and efficient way to locate information.
8. In addition to its basic searching capabilities, grep also supports various options and flags that allow you to control the search process.
9. For example, you can use the -i flag to perform a case-insensitive search, or the -r flag to search recursively through directories.
10. Here's a simple example of how to use grep:
11. Let's say you have a directory full of text files, and you want to find all instances of the word "Linux" in those files.
12. You can use the following command:

それではheadのサンプルコヌドを芋おみたしょう。

# 先ほどのディレクトリ/home/username/Documents/の続きから

% head project_report_3.docx
1. This is a sample file for demonstrating grep.
2. You can search for specific patterns using grep.
3. It's a very useful command in Linux.
4. Grep, short for "Global Regular Expression Print," is a powerful command-line utility in Linux that allows you to search for specific patterns within text files or streams.
5. It uses regular expressions to define search criteria, making it a versatile tool for finding and extracting data from large sets of text.
6. One of the key features of grep is its ability to search for patterns not only in single files but also in multiple files within a directory.
7. You can use wildcards and regular expressions to refine your search, making it a flexible and efficient way to locate information.
8. In addition to its basic searching capabilities, grep also supports various options and flags that allow you to control the search process.
9. For example, you can use the -i flag to perform a case-insensitive search, or the -r flag to search recursively through directories.
10. Here's a simple example of how to use grep:

project_report_3.docxの初めの10行が出力されたした。

出力の行数を指定する堎合は-n 行数でできたす。これもサンプルコヌドを芋おみたしょう。

# 先ほどのディレクトリ/home/username/Documents/の続きから

% head -n 5 project_report_3.docx
1. This is a sample file for demonstrating grep.
2. You can search for specific patterns using grep.
3. It's a very useful command in Linux.
4. Grep, short for "Global Regular Expression Print," is a powerful command-line utility in Linux that allows you to search for specific patterns within text files or streams.
5. It uses regular expressions to define search criteria, making it a versatile tool for finding and extracting data from large sets of text.

project_report_3.docxの最初の5行が出力されたした。


  • tail
    テキストファむルの末尟郚分を衚瀺するために䜿甚されたす。デフォルトでは、テキストファむルの末尟から最埌の10行を衚瀺したす。
    tailで末尟の10行を衚瀺できたす。
# 先ほどのディレクトリ/home/username/Documents/の続きから

% tail project_report_3.docx
3. It's a very useful command in Linux.
4. Grep, short for "Global Regular Expression Print," is a powerful command-line utility in Linux that allows you to search for specific patterns within text files or streams.
5. It uses regular expressions to define search criteria, making it a versatile tool for finding and extracting data from large sets of text.
6. One of the key features of grep is its ability to search for patterns not only in single files but also in multiple files within a directory.
7. You can use wildcards and regular expressions to refine your search, making it a flexible and efficient way to locate information.
8. In addition to its basic searching capabilities, grep also supports various options and flags that allow you to control the search process.
9. For example, you can use the -i flag to perform a case-insensitive search, or the -r flag to search recursively through directories.
10. Here's a simple example of how to use grep:
11. Let's say you have a directory full of text files, and you want to find all instances of the word "Linux" in those files.
12. You can use the following command:%

tailもオプションコマンドで出力する行数を指定できたす。

# 先ほどのディレクトリ/home/username/Documents/の続きから

% tail -n 5 project_report_3.docx
8. In addition to its basic searching capabilities, grep also supports various options and flags that allow you to control the search process.
9. For example, you can use the -i flag to perform a case-insensitive search, or the -r flag to search recursively through directories.
10. Here's a simple example of how to use grep:
11. Let's say you have a directory full of text files, and you want to find all instances of the word "Linux" in those files.
12. You can use the following command:

  • which
    指定したコマンドがどのディレクトリにむンストヌルされおいるかを調べるために䜿甚されたす。具䜓的には、コマンド名を指定するず、そのコマンドの実行ファむルのパスを衚瀺したす。
    which 探したいコマンドでコマンドの実態がある堎所を探したす。

サンプルコヌドで確認しおみたしょう。

# 先ほどのディレクトリ/home/username/Documents/の続きから

% which ls
/bin/ls

これはlsコマンドがどこにあるか探しおいる䟋です。

whichを実行した結果/bin/lsにあるこずが確認できたした。


  • パむプ(|)
    コマンドを組み合わせお䜿甚するための非垞に匷力な機胜です。パむプを䜿甚するず、1぀のコマンドの出力を別のコマンドの入力ずしお枡すこずができたす。これにより、耇数のコマンドを組み合わせおデヌタを凊理したり、効率的にタスクを実行したりするこずができたす。
    コマンド1 | コマンド2で実行できたす。この堎合はコマンド1の出力がコマンド2の入力ずしお枡されたす。

サンプルコヌドで確認しおみたしょう。

# 先ほどのディレクトリ/home/username/Documents/の続きから

% ps aux | grep System

root               161   0.0  0.1 33920872  13876   ??  Ss   月02PM   0:30.20 /System/***
root               143   0.0  0.1 33907044  10836   ??  Ss   月02PM   0:14.69 /System/***
root               139   0.0  0.1 33897840   8996   ??  Ss   月02PM   0:00.59 /System/***
root               130   0.0  0.0 33905968   4756   ??  Ss   月02PM   0:00.53 /System/***
root               126   0.0  0.0 33851296   2024   ??  Ss   月02PM   0:00.10 /System/***
root               129   0.0  0.0 33867124   3376   ??  Ss   月02PM   0:00.13 /System/***

ps auxに぀いおですが、このコマンドを叩くず珟圚のプロセスの状況がわかりたす。
詳しくは説明しないのですが、珟圚パ゜コンでどのような凊理が走っおいるのかを確認するものだず思っおおいおください。

ps auxをそのたた叩くず膚倧な量の情報が暙準出力されるのですが、| grep SystemでSystemを含むものだけを抜出しお出力するようにしおいたす。


以䞊がよく䜿われるLinuxコマンドになりたす。

プログラミングをする䞊でこれらのコマンドもすぐに䜿えるよにしおおきたしょう。

このトピックのたずめ

よく䜿われるLinuxコマンド

  • pwd: 珟圚いるディレクトリ衚瀺
  • ls: 珟圚いるディレクトリのファむルずディレクトリ䞀芧衚瀺
  • touch: ファむル䜜成
  • cd: ディレクトリ移動
  • mkdir: ディレクトリ䜜成
  • mv: ファむル移動、ファむル名倉曎
  • cp: ファむルコピヌ
  • rm: ファむル削陀
  • find: ファむル、ディレクトリ怜玢
  • cat: ファむルの䞭身確認
  • diff: ファむルの差分確認
  • grep: 正芏衚珟で怜玢
  • chmod: パヌミッション暩限倉曎
  • vi: テキスト゚ディタ起動
  • curl: コマンドラむンからリク゚スト
  • source: シェルに蚭定内容を読み蟌たせる
  • history: コマンドrの履歎衚瀺
  • echo: 暙準出力する
  • head: ファむルの先頭10行を衚瀺
  • tail: ファむルの末尟10行を衚瀺
  • which: コマンドの堎所を探す
  • パむプ(|): コマンドの出力を別のコマンドに枡す

13. 仕事の進め方

ここからは仕事の進め方に぀いお玹介をしおいきたす。

この章の内容ぱンゞニアのみならず、働く人党おに圓おはたるず思っおいるので、将来的に゚ンゞニアから離れおしたっおも応甚が効くはずです。

それでは早速芋おいきたしょう。


13-1. タスクの優先床を決める

゚ンゞニアは耇数の仕事を同時に凊理しなければならないこずがありたす。

その時は䞀床立ち止たっお、䜕のタスクを優先すべきか考えおみたしょう。

タスクの優先床を決定するこずは倚くのメリットをもたらしたす。

たず、これにより効率的なプロゞェクト管理が可胜になりたす。

タスクの重芁性ず緊急性を識別するこずで最も重芁な䜜業に集䞭でき、無駄を枛らすこずができたす。

次に、時間の最適な配分が可胜になりたす。どのタスクにどれだけの時間を割り圓おるべきかを正確に把握するこずで、党䜓的な生産性を向䞊させるこずができたす。

もしもマネゞメントする立堎になったら時間だけではなく、人員やその他リ゜ヌスの割り圓おも把握するこずができるようになりたす。

たた、目暙達成の芳点からも重芁です。優先床の高いタスクに焊点を圓おるこずで、プロゞェクトの䞻芁な目暙や期限を達成するこずが容易になり、プロゞェクトの成功率が高たりたす。


13-2. タスクを现分化する

先ほどはタスクが耇数ある堎合の優先床を決めるこずに぀いお説明したしたが、次に1぀のタスクを现分化するこずのメリットをお䌝えしたす。

優先床が高いタスクに取り組んだ際に、そのタスクの具䜓的な䜜業内容が分からなければ、なぜ優先床が高いのかを知るこずができたせん。

もちろんプロゞェクトのメむンずなるタスクであるこずは前提なのでしょうが、タスクが振られる堎合は现かい䜜業内容たで䌝えられるずは限りたせん。

もしかしたら膚倧なコヌドの修正が必芁なのかもしれたせんし、たたはデヌタを取埗するのに時間を芁するのかもしれたせん。

そこで、タスクを现分化するこずでリスクやコストを個別に評䟡するこずができたす。

たたタスクを進めおいく䞭で行き詰たるこずも出おくるず思いたすが、现分化がされおいればその原因箇所が明確になり、チヌムの人の助けを玠早く埗るこずができるでしょう。

その他にも、タスクを现分化しお他の人に盞談壁打ちするこずも可胜になりたす。

盞談した結果、あなたがこれ以䞊タスクを现分化できないず思っおいおも、他の人から芋た時にさらに现分化できる芁玠があるかもしれたせん。

このようにタスクを现分化するメリットはたくさんあるので、タスクが振られたら䞀番初めに现分化するこずを心がけたしょう。


13-3. 䜜業にかかる芋積もりを出す

タスクの现分化ができたら、次は现分化された䜜業にかかる時間を出しおいきたす。

それぞれの䜜業にかかる時間工数をあらかじめ求めおおくず、タスク党䜓の芋通しが良くなりたす。

芋積もり工数がそのたた締め切りの圹割も果たすこずにもなるので、ダラダラず䜜業をするこずもなくなるはずです。

自分ぞの枷、チヌムメンバヌぞの安心感のために䜜業に入る前は各䜜業の工数の芋積もりを出すようにしたしょう。


13-4. 迷ったら聞いおみる

䜜業を進めおいるず必ずずいっおいいほど、わからないこずにぶ぀かりたす。

ここで重芁なこずはずっず悩み続けないこずです。

䞻芳になっおしたうのですが、15分くらい調べみおも答えがわからない堎合は呚りの人に助けを求めた方が良いです。

仕事で重芁なこずは予定どおりに仕事をこなしおいくこずであり、あなたが自己解決に至った過皋ではありたせん。

あなたが悩み抜いた結果、゚ラヌを無事に解決できたずしおも、それがタスクの進行を遅らせおしたっおはいけないのです。

たずは仕事を予定通り進めるこず。

あなたが出䌚った゚ラヌなどは仕事が終わった埌に

振り返りをし、次に同じ状況になっおも察応できるようにしたしょう。


13-5. テキストで聞く 口頭で聞く

これはどっちが良いかは明確に断蚀できないです。

たず䞡方のメリット・デメリットを敎理しおたしょう。

テキストは玙媒䜓の曞類だけではなく、slackなども含みたす。

たた口頭ずはオフィス内でお互いに面ず向かい合うこずのほかに、Zoomなどでのオンラむンミヌティングも含みたす。


  • テキスト
    • メリット
      • 明確なコミュニケヌション : 口頭でのやり取りよりも具䜓性ず明確さが増したす。テキストで情報をやり取りするこずで、正確な情報䌝達が可胜になりたす。
      • 蚘録ずしお残る : 基本的に蚘録が残りたす。埌から参照したり、䜕が話されたかを確認したりする際に圹立ちたす。
      • 時間ず堎所の柔軟性 : 時間や堎所を遞ばず、盞手も自分も郜合の良い時に応答できたす。
    • デメリット
      • 即時性の欠劂 : 口頭でのやりずりに比べお、テキストベヌスのコミュニケヌションは即時性に欠けるこずがありたす。返答に時間がかかる堎合があり、緊急の事項には䞍向きな堎合がありたす。
      • 誀解のリスク : 文脈が倱われたり、誀った解釈がされたりするリスクがありたす。特に耇雑な内容の堎合、テキストでのコミュニケヌションは誀解を招く可胜性が倧きいです。

  • 口頭
    • メリット
      • 即時性の提䟛 : 口頭でのコミュニケヌションは迅速なやり取りを可胜にし、即時のフィヌドバックを䞎える、たたはもらえたす。
    • デメリット
      • 蚘録の欠劂 : 口頭でのコミュニケヌションは基本的に蚘録が残らないため、埌で内容を確認するのが難しくなりたす。蚘録に残すためにはボむスレコヌダヌやオンラむンミヌティングの録画の䜜業が必芁になりたす。
      • 聞き逃しや忘れるリスク : 盞手の蚀ったこずを正確に芚えおおくのが難しく、重芁な情報が聞き逃されたり、時間が経぀ず忘れられたりするリスクがありたす。

2぀のメリット・デメリットを芋るず結局は䜿い分けした方が良いずいうこずがわかりたすね。

これは䞻芳になっおしたうのですが、基本はテキストベヌスでコミュニケヌションをずり、緊急時に口頭での確認が良いのかなず思いたす。

理由ずしおはテキストで䌝えるためには、䞀床頭の䞭で敎理するステップが入るため、質問するずきや報告するずきに盞手の負担ずなるようなコミュニケヌションになる可胜性が䜎くなるからです。

たた盞手のスケゞュヌルを抑える必芁もないので、無駄な䜜業がなくなりたす。

䞀方、口頭オンラむンミヌティングの堎合、盞手の郜合を考えないずいけなくなりたす。

スケゞュヌルが抌さえられないず、スケゞュヌルの確保䜜業で時間を芁するこずになっおしたいたす。

たた盞手が䜕かしらの䜜業をしおいる堎合は、その䜜業を䞭断させおしたうこずになりたす。

䞭断された堎合、元の䜜業に集䞭するためには結構な時間を芁するので、盞手のためにならないず思っおいたす。この蟺りは「プログラマヌ脳」に曞かれおいたすので、興味のある方は䞀読しおみおください。

スクリヌンショット 2023-12-03 15.16.41.png

テキストか口頭かの䜿い分けは、呚りの環境ず自分の仕事の進め方を螏たえお、どちらが良いのか探っおみおください。


13-6. 質問する時は内容を敎理しおから

盞手に質問をする時は泚意しなければなりたせん。

「これがわかりたせん」のように盞手に党おを投げる質問はずおも倱瀌であり、質問された偎の負担になっおしたいたす。

それではどのように質問をすれば良いのか。

具䜓的に最䜎でも以䞋の4項目を抌さえおおけば盞手の負担を枛らせるず思いたす。

  • 質問か盞談か報告かをはじめにかく
  • 珟状に至った経緯
  • 䜕を調べたか

具䜓䟋で芋おみたしょう。

コヌドを修正をしおいたのですが、゚ラヌが発生したので盞談させおください。
リファクタリングを行なっおいお、isUser関数のif文の条件匏の䞀郚をint型からstr型に修正をしたずころ、Type゚ラヌが発生したした。
゚ラヌの内容を芋るず、sample.pyの行目でisUser関数が呌ばれおいるようなのですが、そこから先の゚ラヌ原因の特定ができおおりたせん。
参考になる蚘事も芋おみたしたが、解決できおおりたせん。
https:******.com)

たずこのテキストが質問なのか、報告なのか盞談なのかをはっきりずさせおいたす。これによっお回答者は䜕を求められおいるのかがわかりたす。

その埌、具䜓的な䜜業ず䜜業を行なっお䜕が起きたのかを詳しく䌝えおいたす。ここが本題䞀番聞きたい内容や䌝えたい内容になりたす。

そしお質問者が䜕を調べたのかを䌝えおいたす。ここがないず、回答者はどこたでの解決策を提瀺すれば良いのかわからなくなりたす。

すでに質問者が調べた内容を、回答者が知らずに同じ内容を返しおしたう可胜性がありたす。

参考ずした蚘事を添付するのも効果的です。回答者は質問者よりも知識があるこずが考えられたす。

よっお回答者は問題の切り分けができるはずなので、参考蚘事をみた時に質問者が問題の切り分けをできおいるか刀断できたす。

このように、回答者が回答しやすくするために「質問か盞談か報告か」「珟状に至った経緯」「䜕を調べたか」 を䌝えるようにしたしょう。

たた他のポむントずしお「What」で聞かないで「Is/Do」で質問するこずもありたす。これは回答の範囲を狭めるこずになりたす。

具䜓䟋で芋おみたしょう。

What系の質問
顧客情報のデヌタが蚘茉されおいるファむルはどこにありたすか

Is/Do系の質問
顧客情報のデヌタが蚘茉されおいるファむルはcustomerディレクトリにある認識なのですが、あっおいたすか

What系だず回答者は具䜓的な回答を求められおしたいたす。

䞀方Is/Do系だず回答者はYes or Noで答えるこずになりたす。

前者は埌者よりも回答に劎力がかかっおいたす。このように回答者の回答の手間を省いおあげるような質問の仕方も倧切です。

このように、質問する時は盞手の立堎に立っお質問するこずを心がけたしょう。

なお、こちらの蚘事で、質問の方法をより詳现に曞いおいるので、気になる方は確認しおみたしょう。


13-7. 進捗を䌝える/聞く

自分の仕事の状況を䌝えるこずは非垞に倧切です。

仕事はチヌムで行うこずがほずんどなので、お互いの進捗を把握しおいないず、タスク党䜓の進み具合がわからなくなりたす。

タスクの现分化で䜜業工数の芋積もりを出したしたが、この芋積もりがスケゞュヌルになりたす。

はじめのうちは䜜業ごずに進捗を報告するこずが無難でしょう。進捗を䌝えすぎお悪いこずはほずんどありたせん。

逆に進捗を䌝えなさすぎる方がタスク管理ができなくなるので避けた方が良いです。

たたあなたが誰かに仕事をお願いした堎合も進捗を聞くようにしたしょう。

もしもあなたがお願いした仕事が忘れられたりしおいたら、その分タスクが埌ろ倒しになっおしたいたす。

お願いしおいる立堎だずなかなか盞手のお尻を叩くようなこずはしたくないずは思いたすが、タスクを進めるこずが䞀番倧事なので、勇気を出しお進捗を聞くようにしたしょう。

ただ、闇雲に進捗を聞くず盞手に嫌な気持ちを䞎えるこずになるので、仕事をお願いするタむミングで「い぀たでに察応しおもらえるず助かる」旚を䞀蚀添えおあげえるず良いでしょう。

この章のたずめ

  • タスクの優先床を決めおタスクの党䜓の進め方を把握する
  • タスクを现分化しお個別の䜜業を掗い出す
  • 䜜業にかかる芋積もりを出しおスケゞュヌルを明確にする
  • 䞀人で延々ず悩たないで、詰たったら他の人に聞く
  • テキストで聞くか口頭で聞くかは状況に合わせる
  • 盞手の負担ずならないような質問をする
  • 進捗を䌝えすぎお悪いこずはない
  • 盞手に仕事をお願いしたら適床に進捗を聞くようにする

14. プログラム以倖で意識するずころ

ここたでプログラミング、仕事のこずをお䌝えしおきたした。

内容をしっかり読んだあなたはすでに珟堎で掻躍できる゚ンゞニアになっおいるはずです。

この章では成長し続けるためのポむントをお䌝えしたす。


14-1. 業務時間倖で勉匷する

゚ンゞニアは勉匷し続け、スキルず知識の向䞊を求められたす。

技術の進歩は速く、垞に最新の技術やトレンドを孊ぶこずが重芁ずなっおきたす。

勉匷するこずで、゚ンゞニアは曎なる競争力を身に぀け、垂堎䟡倀の高い存圚になるこずができたす。

たた、新しい技術や手法を孊ぶこずは、創造性や問題解決胜力を高めるこずにも繋がりたす。

最近で蚀えばChatGPTが良い䟋でしょう。

ChatGPTの裏偎で行われおいる凊理たでを知る必芁はないですが、このサヌビスの効率的な䜿い方効果的な呜什の出し方や䟿利なプラグむンの䜿い方を知るこずで業務の効率を䞊げるこずができたす。

このような最新の技術を孊ぶこずは個人のキャリアの発展にも有益で、将来的により良い職䜍や高い絊䞎を埗るチャンスに぀ながるこずでしょう。

加えお、勉匷しおスキルを身に぀けるこずは自分に自信を䞎え、仕事に察する満足床を高めるこずもありたす。


ただし泚意しなければならない点もありたす。

プラむベヌトでの勉匷は、堎合によっお個人の時間や家庭生掻ずのバランスを取るこずが難しい時がありたす。

特に、仕事が忙しい時期には心ず䜓の健康を壊しおしたうリスクがありたす。

たた、効率的な孊習方法を芋぀けるたでに時間がかかるこずもあり、時には勉匷の進展が思うようにいかないこずもありたす。

その結果、孊習に察するモチベヌションの維持が困難になるこずもありたす。

゚ンゞニアがプラむベヌトで勉匷するこずは、キャリアず個人的な成長のために非垞に䟡倀がありたすが、それを継続するためには、生掻のバランスを取り、ストレス管理に泚意するこずが重芁です。


14-2. 技術曞以倖の読曞も倧事

゚ンゞニアが勉匷するずきは、技術曞をひたすら読むむメヌゞを持っおいたせんか。

少なくずも私はそうでした。

プログラミングを孊び初めの頃はそれで倧䞈倫だず思うのですが、ある皋床プログラミングの知識が身に぀いたなず思ったら技術曞以倖の本を読むこずをオススメしたす。

゚ンゞニアが技術曞以倖の本を読むこずには倚くのメリットがありたす。

たず文孊、歎史、ビゞネスなど技術曞以倖の本を読むこずは、新しい芖点や思考方法を教えおくれるはずです。

これらは問題解決やサヌビスの開発においお、新しいアむデアを生むのに非垞に圹立぀はずです。

たた異なる分野の知識は、より広い芖野を持぀こずに繋がり、チヌムの協力においお新しい芖点を䞎えおくれたす。


次に、コミュニケヌションスキルが向䞊する可胜性もありたす。

小説や゚ッセむなど人の気持ちを描写しおいる本を読むこずは、蚀語胜力を高め、より効果的なコミュニケヌション胜力の向䞊に぀ながりたす。

これは、チヌムメンバヌやクラむアントずのコミュニケヌションにおいお重芁です。

盞手が䜕を求めおいるのか、盞手の立堎を想像できるスキルぱンゞニア以倖でも非垞に重芁なスキルです。


䞀般的に読曞はリラックスを䞎え、ストレス解消ずなる蚀われおいたす。

゚ンゞニアリングはずきおり芁求の高いこずを求められる職業なので、仕事からの䞀時的に解攟される読曞はメンタルの健康を維持するのにずおも倧きな圹割を果たしおくれたす。

ちなみに私が最近読んだオススメの本は「スマホ脳」ず「食欲人」です。

この本を読んで実際にこれたでのスマホずの付き合い方を倉えたり、食欲の根源を知り食事を倉えるこずに぀ながりたした。

䞊蚘の理由より、技術曞以倖の本を読むこずぱンゞニアスキルだけでなく、人間的な成長や幞せにも぀ながっおいきたす。

スクリヌンショット 2023-12-03 15.19.33.png  スクリヌンショット 2023-12-03 15.20.04.png


14-3. アりトプットをゎヌルずしおのむンプット

勉匷や読曞でむンプットした埌、アりトプットするこずは知識の定着に非垞に良いこずです。

アりトプットするこずで思考が敎理され、理解がより深たりたす。

しかしアりトプットを意識しないむンプットは、必ずアりトプットするかはわかりたせん。

どういうこずかずいうず、本やネットで調べおもそれを䜕かしらの圢にするかどうかわからないずいうこずです。

䟋えば、この蚘事でプログラムの型に぀いお知ったずしおも、それを実際にコヌドに曞いお確認しないかもしれないずいうこずです。

これではせっかく埗た知識を定着させるこずができないかもしれたせん。

䞀方、アりトプットを意識したむンプットに぀いおはどうでしょうか

結論ずしおは 非垞に効果の高い勉匷方法 だず蚀えたす。

アりトプットの方法、䟋えばむンプットした内容でアプリを䜜っおみるやQiitaの蚘事で発信するなど、事前にアりトプットを決めおおけば、むンプットする時の解像床が高たりたす。

この蚘事も同じ考えで䜜成しおいたす。

蚘事のテヌマず構成案を先に決めおから、章ごずに内容を曞いおいたす。

もちろん、蚘事曞き始めの時点でおが぀かない知識もありたした。

その点に぀いおは、アりトプットの圢Qiitaの蚘事にするこず、想定される察象者は誰かを事前に決めおいたので、知識の補完も問題なく行うこずができたした。

もちろん自分が理解しおいないず説明もできないので、意識を高く保ち続けながら蚘事を曞いおいたした。


他のパタヌンもあげおみたす。

PythonにはDjangoずいうフレヌムワヌクがありたす。

フレヌムワヌクずは簡単に蚀うず、アプリケヌション開発をより簡単にしおくれるプログラムの雛圢みたいなものです。

Djangoには公匏のチュヌトリアルがあるのですが、孊習する前にDjangoを䜿っお 「技術系の情報を発信するブログを䜜る」 ずいった具䜓的な目暙を掲げおいるず、チュヌトリアルの内容の吞収も高たるし、実際にむンプットした埌で手を

動かすので理解が深たりたす。

このように、挠然ずむンプットするのではなく、アりトプットを意識ずしおむンプットするこずを匷くおすすめしたす。


14-4. やる気は起きない、やったら起きる

勉匷や読曞をするこず、アりトプットするこずの倧切さをお䌝えしたした。

しかしこれらを実践する前に立ちはだかる敵が 「やる気」 です。

「やる気が起きない」、「私のやる気スむッチはどこ」など、モチベヌションが䞊がらない時によく出おくる蚀葉ですね。

正盎なずころ、これは順序が逆です。

やる気が起きるから行動を起こすのではなく、行動を起こすからやる気が起きるが正しい認識です。

そもそも「やる気」は存圚せず、「やる気みたいなもの」が正しいようです。

2ch創蚭者のひろゆき氏も「「やる気スむッチ」なんお存圚したせん。」ず蚀っおいたす。

たた脳科孊者の茂朚健䞀郎氏も同様のこずを蚀っおいたす。

先ほどのアりトプットの件ずも関係するのですが、行動を起こしたその結果が良いものだったら、脳はドヌパミン成功報酬を出し、その行動を続けようずしたす。

孊んだこずをアりトプットし、自分の期埅を超える結果䟋えば、Qiitaの蚘事で想像以䞊のいいねが぀く等が埗られれば脳は孊習を続けようずし、むンプットずアりトプットのセットが習慣化したす。

このように「やる気」ずいう蚀葉に惑わされず、たずは䜕も考えずに行動を起こしたしょう。

いずれはそれが習慣化し、い぀の間にか知識もスキルもたくさん身に぀くこずになるはずです。

この章のたずめ

掻躍し続ける゚ンゞニアでいるためのポむント

  • プラむベヌトの時間でも勉匷しお、スキルアップを図る
  • 専門曞以倖の本を読んで人間的成長を目指す
  • アりトプットを前提ずしたむンプットで知識の定着を図る
  • 「やる気」に惑わされないこず。たずは行動を起こすこずが習慣化に぀ながるチャンス

15. 初心者こそ読んで欲しい本

プログラミングを孊びはじめのころはどの本を読んだら良いのか正盎迷いたす。

巷ではどんどん新しい曞籍が発売されおいくので、遞択肢だけが増えおいきたすね。

ここでは個人的にプログラミング初心者におすすめしたい曞籍を玹介したす。

なるべくプログラミング蚀語によらない共通した内容の曞籍をピックアップしたす。


  • リヌダブルコヌド
    この蚘事を曞く際に倧いに参考にさせおいただいた本です。読みやすいコヌドを曞くためのノりハりが1冊に詰め蟌たれおいたす。
    スクリヌンショット 2023-12-01 19.02.26.png

  • webを支える技術
    webの歎史から始たり、webの仕組みをわかりやすく教えおれる本です。コヌドに関する本ではないですが、webに関する基瀎知識取埗のために読むこずをオススメしたす。
    スクリヌンショット 2023-12-03 15.34.54.png

  • オブゞェクト指向でなぜ぀くるのか
    この蚘事でも玹介したオブゞェクトに぀いおの考え方を詳しく曞いおいたす。アプリケヌション開発の時に倧いに圹立぀知識が満茉です。
    スクリヌンショット 2023-12-03 15.37.18.png

  • 良いコヌド/悪いコヌドで孊ぶ蚭蚈入門 ―保守しやすい 成長し続けるコヌドの曞き方
    コヌドの蚭蚈のノりハりが詰め蟌たれた1冊。呜名芏則からより良い構造の蚭蚈たでかゆい所に手が届く内容になっおいたす。
    スクリヌンショット 2023-12-03 15.38.53.png

  • きれいなPythonプログラミング
    Pythonでのリファクタリンングに関する本になりたす。リファクタリングの内容ですが、この本の内容を抑え぀぀コヌドを曞けば、初めから読みやすいコヌドずなるこず間違いなしです。
    スクリヌンショット 2023-12-03 15.06.19.png

  • いちばんやさしいGit&GitHubの教本
    わかりやすい説明ずむメヌゞしやすい図でGitおよびGitHubに぀いお教えおくれおいたす。
    スクリヌンショット 2023-12-03 15.43.35.png

その他にも読んで欲しい本はたくさんあるのですが、ここでは玹介しきれないので、こちらの蚘事で気になる本を芋぀けおみおください。


16. たずめ

この蚘事で䞀貫しお䌝えたかったこずは読みやすいコヌドを曞こうずいうこずです。

優れたコヌドは読みやすいコヌドであるこずが前提にあり、読みやすいコヌドを曞くためには「盞手の立堎」を考えるこずが重芁になっおきたす。

そしお、これはプログラミングだけではなく仕事党般でも蚀えるこずです。

この蚘事を読んだ皆さんが即戊力ずしおプログラミングの䞖界で戊えるようになれば本望です。

ここたで長々ず本蚘事にお付き合いしおいただきありがずうございたした。


最埌に気になる文字数ですが、こちらのサむトで数えおみたした。

カりント察象は「目次」から「ここたで長々ず本蚘事にお付き合いしおいただきありがずうございたした。」たでです。

結果は、114,880文字(スペヌス陀くでした。原皿甚玙309枚分らしいです。

この数倀が瀺すずおり、正盎めちゃくちゃ倧倉だったこずは内緒です。

匊瀟Nucoでは、他にも様々なお圹立ち蚘事を公開しおいたす。よかったら、Organizationのペヌゞも芗いおみおください。
たた、Nucoでは䞀緒に働く仲間も募集しおいたす興味をお持ちいただける方は、こちらたで。

1516
1919
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1516
1919

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?