SlideShare a Scribd company logo
1 of 28
良いコードとは
まついのぶゆき
良いコードとは
• (エンタープライズにおける)良いコードとは、「読みやすくて
理解しやすく、修正しやすいコード」のことである
• メモリ使用量やCPU使用量、I/O転送量が低いコードのことではない
• 少しでも高速に動作するコードのことではない
• ゲームや特殊な環境で動作するソフトウェアなどでは、こういうコードが「良
い」コードの場合もある
• トリッキーな手段を駆使してなるべく短くかかれたコードのことではない
• 競技プログラミングなどでは、こういうコードが「良い」コードの場合もある
なぜ「良い」コードを書くべきなのか
• エンタープライズでは、チームで開発することが多い
• 一人ですべて開発するのだとしても、3か月前の自分は他人
• エンタープライズでのコードは、「書かれる」よりも「読まれる」
ことが圧倒的に多い
• エンタープライズのコードは機能拡張が常に発生するため、拡張に
関連「しそうな」コードは全て読まなければならない
• 障害の発生時には、障害周辺のコードを素早く読まなければならない
• そのため「今動作する」ことが重要なのではなく、「読まれて
理解しやすい」コードを書くことが重要となる
「良い」コードの基本方針
• 読みやすい書き方を心がける
• ロジックをシンプルに保つ
• コードを再構成(リファクタリング)する
• テストできるように書く
読みやすい書き方
• 適切なネーミングを行う
• その変数や関数がやりたいことを端的に表現する明確な単語を選ぶ
• getなどの関数名や、resultといった変数名は、中身が何なのかわからない
• 明確な単語に情報を付加すると良い
• ファイルサイズを格納する変数には、uploaded_file_mbにするとか
• tmpやbufのような、汎用の名前は避ける
• ただし一画面で収まるスコープに限定される変数名の場合、使っても良い
• ループ変数などもスコープが限定されるため、i や j で良い
• 明確な名前が選べなかったり、非常に長い名前を付けたくなる場合は、
適切なモジュール分割ができていない
• canvas_max_pxって付けたくなる場合、max_pxをインスタンス変数に持つ
Canvasクラスが存在するのでは?
読みやすい書き方
• 適切なコーディングスタイルとネーミングスタイルに従う
• 言語に対してデファクトとなっているスタイルをなるべく利用し、
できる限りルールを発明しない
• 例えばPythonなら
• PEP8
• http://legacy.python.org/dev/peps/pep-0008/
• Google Python Style Guide
• http://google-styleguide.googlecode.com/svn/trunk/pyguide.html
• インデントや空行も意味があるので、スタイルに従う
• Pythonのようにインデントが制御構造に直接関係しなくても、意識して使う
読みやすい書き方
• 見た目の一貫性を重視する
• 例えば
• 同じ変数を引数にする関数が複数あるならば、同じ順序にする
• 同じ意味を持つ変数を複数のモジュールで定義するならば、同じ名前にする
• 読む人が「あれっ?以前でてきたアレでもこうだっけ?」とならないように
読みやすい書き方
• なるべく自分で書かない
• 言語が持っている機能やデファクトで利用されるライブラリの機能を
最大限活用する
• ソート処理や探索処理などは、セキュアで高速な実装が言語処理系から
たいてい提供されている
• 文字列処理等の誰でも欲しい機能は、Javaならばapache commons
Rubyならばactive supportなどのライブラリがたいてい提供している
• 言語仕様だけでなく、言語が提供する関数仕様やメジャーなライブラリ
仕様は一読しておくと良い
読みやすい書き方
• 適切なコメントをつける
• 「プロジェクトルールだから」と、意味のないコメントは付けない
• そのクラスやメソッドを実装しようと思った意図や設計思想をコメントする
• そもそもコレは何をするためのものなのか?
• なぜこのロジックを選択したのか?代替手段はあったのか?
• 自分で微妙と思っている箇所もコメントする
• 例えば
• このロジックは動作するけれど、データ量に対して計算量がO(n^2)になる
• このメソッドは破壊的なので、一度呼び出すと内部データは変更されてしまう
• コードを見たらわかることはコメントしない
• 処理の手続きをコメントしなければ理解できないコードは、「悪い」コード
ロジックをシンプルに保つ
• 条件分岐
• 単純で重要な条件を先に評価する
• ド・モルガンの法則やカルノー図を使うことで、条件を簡約化できないか
考える
• ド・モルガンの法則
• not (A or B) == (not A) and (not B)
• not (A and B) == (not A) or (not B)
ロジックをシンプルに保つ
• カルノー図の効用(by @kawasima)
• 例えば以下のような条件が提示された場合
ロジックをシンプルに保つ
• カルノー図の効用(by @kawasima)
• 普通に実装すればこうなるけれど
ロジックをシンプルに保つ
• カルノー図の効用(by @kawasima)
• カルノー図を書いてみるとこうなるので
ロジックをシンプルに保つ
• カルノー図の効用(by @kawasima)
• もっとシンプルな条件で実装できる
ロジックをシンプルに保つ
• 関数内からはなるべく早く返す
• 判断した条件をずっと覚えておくよりは、異常時にはさっさと関数から
抜け出してしまった方が読みやすい
def construct_msg(num_pageview):
msg = ""
if (isValid(num_pageview)):
foo()
…
bar()
…
msg = buz()
else:
msg = "invalid"
return msg
def construct_msg(num_pageview):
if (not isValid(num_pageview)):
return "invalid"
foo()
…
bar()
…
return buz()
ロジックをシンプルに保つ
• トリッキーなコードは書かない
• 言語仕様上許されているからと言って、トリッキーなコードを書いて
「オレスゲー」しない
xx = 1
yy = 2
def f(x,y):
return x + y + xx + yy
globals().update({"xx":1,"yy":2,"f":lambda x,y:x+y+xx+yy})
=
ロジックをシンプルに保つ
• トリッキーなコードは書かない
• 言語仕様上許されているからと言って、トリッキーなコードを書いて
「オレスゲー」しない
def check(x):
if x%2 == 0:
return even()
else:
return odd()
def check(x): return odd() if x%2 else even()
=
def check(x): return (x%2 and [odd()] or [even()])[0]
=
def check(x): return [even, odd][x%2]()
=
ロジックをシンプルに保つ
• 性能向上やメモリ削減のための特殊な実装は、最後の最後
• パレートの法則にあるように、性能劣化やメモリ消費を引き起こすコード
は、全体のうちのホンの一部
• 最初は読みやすいコードを心がける
• システム全体の性能を計測し、システムの性能劣化やメモリ消費に影響の
大きな箇所からピンポイントに修正する
• 本当に性能が必要なのだとしたら、ピンポイントにCで書き換えても良い
• というか、SQLチューニングが最も効果的だったりする
• ただし不用意なネストループやO(n2)の探索アルゴリズムなど、
わかりきった遅いコードは最初から避けるべき
※パレートの法則
「全体の数値の大部分は、全体を構成する一部の要素が生み出す」
「8:2の法則」
コードを再構成(リファクタリング)する
• 一画面に収まらない処理はモジュール分割できないか考える
• コードが実現したいこと(コメントとして一行で書ける目的)に直接関係
しない処理は、別のモジュールに切り出す
• ネーミングが適切に行われていれば、切りだされたモジュールのコード
を読まずともモジュールの処理内容をざっくり理解できるので、元の
コードが理解しやすくなる
• では、どのような方針で分割すべきだろう?
コードを再構成(リファクタリング)する
• the Open-Closed Principle(OCP)
• 「ソフトウェアの構成要素は、拡張に対して開いていて、修正に対して
閉じていなければならない」
• OCPが意識されているモジュールは、修正しても他のモジュールに
影響を与えない
=オブジェクト指向設計の原則
• API仕様の重要性
• 外部に公開しているAPIの仕様(公開されているメソッドのINPUTに対して何
がOUTPUTされるか、その際に発生する副作用は何か)が変わらないので
あれば、中のコードが書き換わっていても誰も気にしない
コードを再構成(リファクタリング)する
• 関数の副作用とは
• (数学的な意味の)関数=入力を出力に変換するモノ
• 入力を出力に変換する以外に、関数外部の環境へ影響を及ぼす行為
=副作用
• ファイルやネットワークの入出力、画面の入出力、データベースの入出力
などは全て副作用
• 関数外部の変数への入出力も副作用
• 副作用がない関数は、いついかなる状況で呼び出しても必ず同じ結果
• テストしやすく堅牢なモジュールになる
• 関数型プログラミング言語は、基本的に副作用の無い関数でシステム
を組み立て、副作用のある行為を限定することで堅牢なシステムを作る
• ただし「副作用」が全くないシステムには意味が無い
コードを再構成(リファクタリング)する
• 関数型プログラミングのエッセンスを取り入れる
• 変数のスコープはなるべく小さくする
• グローバル変数は敵
• 値を代入するのは一回だけ(同じ変数の使い回しや書き換えはしない)
• ループ変数など小さな関数内部に限定された変数は書き換えても良い
• 暗黙的に依存する変数を書き換えるような関数を作ると、思いもよらない箇所
で変数が書き換わるややこしいバグを生む可能性がある
• list.append()なども、変数の中身を書き換えていることに注意
• 例えばリスト内包表記を用いれば、元のリストはそのままで新しいリストが生成される
>>> x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> y = [i * 2 for i in x if i%2 == 0]
>>> y
[4, 8, 12, 16, 20]
>>> x
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
コードを再構成(リファクタリング)する
• 関数型プログラミングのエッセンスを取り入れる
• 関数に与える引数は、関数内で書き換えない
• JavaやPythonの関数の引数は参照渡しなので、仕様上は引数オブジェクト
の中身を書き換えることができるが、基本的には書き換えてはいけない
• 関数からの出力は、すべて戻り値として返す
• 例外発生時は、戻り値ではなく例外をraiseする
• 結局・・・
• 「外部入出力など副作用を前提とした部分」と「クラスの内部データに
依存した処理を行う部分」と「副作用が全く無い関数」を明確に分割し、
そのコードが影響を及ぼす範囲を局所化することが重要
コードを再構成(リファクタリング)する
• the Single Responsibility Principle(SRP)
• クラスの役割はただ一つだけ
• クラスのコメントに、「このクラスはXXをする役割を担う」と一文で表現できな
ければならない
• クラスの実装を変更する理由は、その「XXの役割」に拡張や修正があっ
たときだけのはず
• 「XXの役割の修正」以外の理由でプログラムを修正する際に、なぜか「XXの
役割」のクラスに修正が入るようであれば、クラスの分割が間違っている
コードを再構成(リファクタリング)する
• 適切なクラスを見出すために、デザインパターンを活用する
• イイカンジにクラスを分割するためのベストプラクティス集
• 最も伝統的なもの:GoF(Gang of Four)デザインパターン
• GoF以外にも、様々なデザインパターンが提唱されている
• ただし「パターンを使いたい」がためにパターンを使っては本末転倒
コードを再構成(リファクタリング)する
• コードの適切さを評価するために、メトリクスを活用する
• 凝集度と結合度
• モジュールのOCPやSRPを計測する尺度
• 凝集度は高く、結合度は低いのが望ましい
• コードメトリクスツールで数値化することができる
• 細かい数値にはあまり意味がなく、ざっくりとした傾向を見るために用いる
• McCabeの循環的複雑度
• コードの複雑さ(ループや分岐の度合い)を計測する尺度
• 一般的には、10以下が良いと言われている
• 30を超えると構造的に失敗したモジュールと言われており、50を超えるとテスト不
可能で、75を超えると微細な修正であってもバグが混入するらしい
テストできるように書く
• 副作用のない関数は、容易にテストできる
• なるべくシンプルに、網羅的に
• ただし闇雲に様々な値でテストを書くのではなく、なぜその入力で
テストをするのか、明確な理由を考える
• 限界値
• 期待している値の最大値を+1超えた値、最小値を-1した値等
• 特殊値
• 数値ならば0
• 文字(utf-8)ならば、ビットパターンが1byteになる文字(US-ASCII文字)、2byteに
なる文字(ギリシャ文字等)、3byteになる文字(常用漢字や丸数字等)、4byte以上
になる文字(JIS X 0213の第3・4水準漢字)など
• 文字(Shift-JISやCP932)ならば、「表」や「ー」など2byte目が0x5c(バックスラッ
シュ)になる文字や、CP932からUTF-8に変換することによって化ける文字(~)等
テストできるように書く
• 副作用のある処理
• スタブやドライバを駆使してテストを書く
• テストフレームワークが提供する機能をうまく活用する
• 適切にモジュール分割されテストできるように書かれた
プログラムを継続的にテストし続けることで、チームで
開発していても安心して機能拡張をすることができる

More Related Content

What's hot

40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていることonozaty
 
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)lestrrat
 
「DX完全に理解した」「DXわけがわからないよ」なユーザ企業の方へ
「DX完全に理解した」「DXわけがわからないよ」なユーザ企業の方へ「DX完全に理解した」「DXわけがわからないよ」なユーザ企業の方へ
「DX完全に理解した」「DXわけがわからないよ」なユーザ企業の方へYoheiGibo
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
Parser combinatorってなんなのさ
Parser combinatorってなんなのさParser combinatorってなんなのさ
Parser combinatorってなんなのさcct-inc
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?Teppei Sato
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)Mikiya Okuno
 
ビジネスパーソンのためのDX入門講座エッセンス版
ビジネスパーソンのためのDX入門講座エッセンス版ビジネスパーソンのためのDX入門講座エッセンス版
ビジネスパーソンのためのDX入門講座エッセンス版Tokoroten Nakayama
 
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースHajime Yanagawa
 
TRICK 2022 Results
TRICK 2022 ResultsTRICK 2022 Results
TRICK 2022 Resultsmametter
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門masayoshi takahashi
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかKoichiro Matsuoka
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビューTakafumi ONAKA
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかAtsushi Nakada
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ増田 亨
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
 

What's hot (20)

40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること
 
Oss貢献超入門
Oss貢献超入門Oss貢献超入門
Oss貢献超入門
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
 
「DX完全に理解した」「DXわけがわからないよ」なユーザ企業の方へ
「DX完全に理解した」「DXわけがわからないよ」なユーザ企業の方へ「DX完全に理解した」「DXわけがわからないよ」なユーザ企業の方へ
「DX完全に理解した」「DXわけがわからないよ」なユーザ企業の方へ
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
Parser combinatorってなんなのさ
Parser combinatorってなんなのさParser combinatorってなんなのさ
Parser combinatorってなんなのさ
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
 
ビジネスパーソンのためのDX入門講座エッセンス版
ビジネスパーソンのためのDX入門講座エッセンス版ビジネスパーソンのためのDX入門講座エッセンス版
ビジネスパーソンのためのDX入門講座エッセンス版
 
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェース
 
TRICK 2022 Results
TRICK 2022 ResultsTRICK 2022 Results
TRICK 2022 Results
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 

Viewers also liked

エスイーが要件定義でやるべきたったひとつのこと
エスイーが要件定義でやるべきたったひとつのことエスイーが要件定義でやるべきたったひとつのこと
エスイーが要件定義でやるべきたったひとつのことYoshitaka Kawashima
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)Yoshitaka Kawashima
 
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
渋谷JVM#1 Immutable時代のプログラミング言語 ClojureYoshitaka Kawashima
 
やっとわかったタイピングスピード向上のコツ
やっとわかったタイピングスピード向上のコツやっとわかったタイピングスピード向上のコツ
やっとわかったタイピングスピード向上のコツRyosuke Yamazaki
 
たとえ日本人同士でも必要な異文化理解力
たとえ日本人同士でも必要な異文化理解力たとえ日本人同士でも必要な異文化理解力
たとえ日本人同士でも必要な異文化理解力Yoshitaka Kawashima
 
JDK9 新機能 (日本語&ショートバージョン) #jjug
JDK9 新機能 (日本語&ショートバージョン) #jjugJDK9 新機能 (日本語&ショートバージョン) #jjug
JDK9 新機能 (日本語&ショートバージョン) #jjugYuji Kubota
 
Java でつくる 低レイテンシ実装の技巧
Java でつくる低レイテンシ実装の技巧Java でつくる低レイテンシ実装の技巧
Java でつくる 低レイテンシ実装の技巧 Ryosuke Yamazaki
 
JVM言語を使ってみようの歌
JVM言語を使ってみようの歌JVM言語を使ってみようの歌
JVM言語を使ってみようの歌YujiSoftware
 
java.lang.OutOfMemoryError #渋谷java
java.lang.OutOfMemoryError #渋谷javajava.lang.OutOfMemoryError #渋谷java
java.lang.OutOfMemoryError #渋谷javaYuji Kubota
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)Yoshitaka Kawashima
 
楽して JVM を学びたい #jjug
楽して JVM を学びたい #jjug楽して JVM を学びたい #jjug
楽して JVM を学びたい #jjugYuji Kubota
 
Graph Algorithms Part 1
Graph Algorithms Part 1Graph Algorithms Part 1
Graph Algorithms Part 1Taku Miyakawa
 
言語設計者が意味論を書くときに考えていたこと
言語設計者が意味論を書くときに考えていたこと言語設計者が意味論を書くときに考えていたこと
言語設計者が意味論を書くときに考えていたことTaku Miyakawa
 
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccJEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccYujiSoftware
 
ITエンジニアに易しいUI/UXデザイン
ITエンジニアに易しいUI/UXデザインITエンジニアに易しいUI/UXデザイン
ITエンジニアに易しいUI/UXデザインRoy Kim
 
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にTaku Miyakawa
 

Viewers also liked (17)

エスイーが要件定義でやるべきたったひとつのこと
エスイーが要件定義でやるべきたったひとつのことエスイーが要件定義でやるべきたったひとつのこと
エスイーが要件定義でやるべきたったひとつのこと
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
 
エスイーのしごと
エスイーのしごとエスイーのしごと
エスイーのしごと
 
やっとわかったタイピングスピード向上のコツ
やっとわかったタイピングスピード向上のコツやっとわかったタイピングスピード向上のコツ
やっとわかったタイピングスピード向上のコツ
 
たとえ日本人同士でも必要な異文化理解力
たとえ日本人同士でも必要な異文化理解力たとえ日本人同士でも必要な異文化理解力
たとえ日本人同士でも必要な異文化理解力
 
JDK9 新機能 (日本語&ショートバージョン) #jjug
JDK9 新機能 (日本語&ショートバージョン) #jjugJDK9 新機能 (日本語&ショートバージョン) #jjug
JDK9 新機能 (日本語&ショートバージョン) #jjug
 
Java でつくる 低レイテンシ実装の技巧
Java でつくる低レイテンシ実装の技巧Java でつくる低レイテンシ実装の技巧
Java でつくる 低レイテンシ実装の技巧
 
JVM言語を使ってみようの歌
JVM言語を使ってみようの歌JVM言語を使ってみようの歌
JVM言語を使ってみようの歌
 
java.lang.OutOfMemoryError #渋谷java
java.lang.OutOfMemoryError #渋谷javajava.lang.OutOfMemoryError #渋谷java
java.lang.OutOfMemoryError #渋谷java
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
 
楽して JVM を学びたい #jjug
楽して JVM を学びたい #jjug楽して JVM を学びたい #jjug
楽して JVM を学びたい #jjug
 
Graph Algorithms Part 1
Graph Algorithms Part 1Graph Algorithms Part 1
Graph Algorithms Part 1
 
言語設計者が意味論を書くときに考えていたこと
言語設計者が意味論を書くときに考えていたこと言語設計者が意味論を書くときに考えていたこと
言語設計者が意味論を書くときに考えていたこと
 
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccJEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
 
ITエンジニアに易しいUI/UXデザイン
ITエンジニアに易しいUI/UXデザインITエンジニアに易しいUI/UXデザイン
ITエンジニアに易しいUI/UXデザイン
 
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心に
 

Similar to 良いコードとは

【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門sandai
 
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010Tsukasa Oi
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編Miki Shimogai
 
使い捨て python コードの書き方
使い捨て python コードの書き方使い捨て python コードの書き方
使い捨て python コードの書き方Sho Shimauchi
 
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1信之 岩永
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, CodereadingHiro Yoshioka
 
最先端NLP勉強会2017_ACL17
最先端NLP勉強会2017_ACL17最先端NLP勉強会2017_ACL17
最先端NLP勉強会2017_ACL17Masayoshi Kondo
 
C++ Transactional Memory言語拡張の紹介
C++ Transactional Memory言語拡張の紹介C++ Transactional Memory言語拡張の紹介
C++ Transactional Memory言語拡張の紹介yohhoy
 
Terraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as CodeTerraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as CodeTakahisa Iwamoto
 
Code Reading at Security and Programming camp 2011
Code Reading at Security and Programming camp 2011 Code Reading at Security and Programming camp 2011
Code Reading at Security and Programming camp 2011 Hiro Yoshioka
 
Programming camp code reading
Programming camp code readingProgramming camp code reading
Programming camp code readingHiro Yoshioka
 
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくばHirotaka Kawata
 
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門Daiyu Hatakeyama
 
Meltdown を正しく理解する
Meltdown を正しく理解するMeltdown を正しく理解する
Meltdown を正しく理解するNorimasa FUJITA
 
seccamp2012 チューター発表
seccamp2012 チューター発表seccamp2012 チューター発表
seccamp2012 チューター発表Hirotaka Kawata
 
Java EE7 䛸㻌JCache 
Java EE7 䛸㻌JCache Java EE7 䛸㻌JCache 
Java EE7 䛸㻌JCache maruyama097
 
さわってみようTOPPERS/SSP
さわってみようTOPPERS/SSPさわってみようTOPPERS/SSP
さわってみようTOPPERS/SSPNSaitoNmiri
 
これからのコンピューティングの変化とこれからのプログラミング at 広島
これからのコンピューティングの変化とこれからのプログラミング at 広島これからのコンピューティングの変化とこれからのプログラミング at 広島
これからのコンピューティングの変化とこれからのプログラミング at 広島なおき きしだ
 

Similar to 良いコードとは (20)

【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門
 
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
 
Code jp2015 cpuの話
Code jp2015 cpuの話Code jp2015 cpuの話
Code jp2015 cpuの話
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編
 
使い捨て python コードの書き方
使い捨て python コードの書き方使い捨て python コードの書き方
使い捨て python コードの書き方
 
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, Codereading
 
最先端NLP勉強会2017_ACL17
最先端NLP勉強会2017_ACL17最先端NLP勉強会2017_ACL17
最先端NLP勉強会2017_ACL17
 
C++ Transactional Memory言語拡張の紹介
C++ Transactional Memory言語拡張の紹介C++ Transactional Memory言語拡張の紹介
C++ Transactional Memory言語拡張の紹介
 
Terraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as CodeTerraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as Code
 
Code Reading at Security and Programming camp 2011
Code Reading at Security and Programming camp 2011 Code Reading at Security and Programming camp 2011
Code Reading at Security and Programming camp 2011
 
Programming camp code reading
Programming camp code readingProgramming camp code reading
Programming camp code reading
 
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
 
JAWS DAYS 2019
JAWS DAYS 2019JAWS DAYS 2019
JAWS DAYS 2019
 
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
 
Meltdown を正しく理解する
Meltdown を正しく理解するMeltdown を正しく理解する
Meltdown を正しく理解する
 
seccamp2012 チューター発表
seccamp2012 チューター発表seccamp2012 チューター発表
seccamp2012 チューター発表
 
Java EE7 䛸㻌JCache 
Java EE7 䛸㻌JCache Java EE7 䛸㻌JCache 
Java EE7 䛸㻌JCache 
 
さわってみようTOPPERS/SSP
さわってみようTOPPERS/SSPさわってみようTOPPERS/SSP
さわってみようTOPPERS/SSP
 
これからのコンピューティングの変化とこれからのプログラミング at 広島
これからのコンピューティングの変化とこれからのプログラミング at 広島これからのコンピューティングの変化とこれからのプログラミング at 広島
これからのコンピューティングの変化とこれからのプログラミング at 広島
 

More from Nobuyuki Matsui

FIWARE勉強会 20190913
FIWARE勉強会 20190913FIWARE勉強会 20190913
FIWARE勉強会 20190913Nobuyuki Matsui
 
CCSE2019 TIS - 自律移動サービスロボットの地図とデータモデルの共通化への取り組み
CCSE2019 TIS - 自律移動サービスロボットの地図とデータモデルの共通化への取り組みCCSE2019 TIS - 自律移動サービスロボットの地図とデータモデルの共通化への取り組み
CCSE2019 TIS - 自律移動サービスロボットの地図とデータモデルの共通化への取り組みNobuyuki Matsui
 
FIWARE-based Robot Management Platform ~ RoboticBase~
FIWARE-based Robot Management Platform ~ RoboticBase~FIWARE-based Robot Management Platform ~ RoboticBase~
FIWARE-based Robot Management Platform ~ RoboticBase~Nobuyuki Matsui
 
Jazug-8th: Azure AKS & FIWARE & Robot
Jazug-8th: Azure AKS & FIWARE & RobotJazug-8th: Azure AKS & FIWARE & Robot
Jazug-8th: Azure AKS & FIWARE & RobotNobuyuki Matsui
 
JTF2018 FIWARE x robot x IoT
JTF2018 FIWARE x robot x IoTJTF2018 FIWARE x robot x IoT
JTF2018 FIWARE x robot x IoTNobuyuki Matsui
 
Dockerのネットワークについて
DockerのネットワークについてDockerのネットワークについて
DockerのネットワークについてNobuyuki Matsui
 
【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ
【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ
【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイNobuyuki Matsui
 
SoftLayer Bluemix SUMMIT 2015 : Intel Edisonクラスタ x Bluemixによる IoTアプリケーションの実装
SoftLayer Bluemix SUMMIT 2015 : Intel Edisonクラスタ x Bluemixによる IoTアプリケーションの実装SoftLayer Bluemix SUMMIT 2015 : Intel Edisonクラスタ x Bluemixによる IoTアプリケーションの実装
SoftLayer Bluemix SUMMIT 2015 : Intel Edisonクラスタ x Bluemixによる IoTアプリケーションの実装Nobuyuki Matsui
 
Jtf2015 edison consul_cluster
Jtf2015 edison consul_clusterJtf2015 edison consul_cluster
Jtf2015 edison consul_clusterNobuyuki Matsui
 
【第17回八子クラウド座談会 LT】CloudConductor+VDCのご紹介
【第17回八子クラウド座談会 LT】CloudConductor+VDCのご紹介【第17回八子クラウド座談会 LT】CloudConductor+VDCのご紹介
【第17回八子クラウド座談会 LT】CloudConductor+VDCのご紹介Nobuyuki Matsui
 
【第11回 クラウドごった煮(コンテナ勉強会)】Docker networking tools
【第11回 クラウドごった煮(コンテナ勉強会)】Docker networking tools【第11回 クラウドごった煮(コンテナ勉強会)】Docker networking tools
【第11回 クラウドごった煮(コンテナ勉強会)】Docker networking toolsNobuyuki Matsui
 
【Tech-Circle #3 & OCDET #7 SDS勉強会】 Ceph on SoftLayer
【Tech-Circle #3 & OCDET #7 SDS勉強会】 Ceph on SoftLayer【Tech-Circle #3 & OCDET #7 SDS勉強会】 Ceph on SoftLayer
【Tech-Circle #3 & OCDET #7 SDS勉強会】 Ceph on SoftLayerNobuyuki Matsui
 
【第5回東京SoftLayer勉強会】LT7 SoftLayerでOpenStackを動かしてみた
【第5回東京SoftLayer勉強会】LT7 SoftLayerでOpenStackを動かしてみた【第5回東京SoftLayer勉強会】LT7 SoftLayerでOpenStackを動かしてみた
【第5回東京SoftLayer勉強会】LT7 SoftLayerでOpenStackを動かしてみたNobuyuki Matsui
 
Raspberry Pi + AWS + SoftEtherVPN + RemoteWorks = ?
Raspberry Pi + AWS + SoftEtherVPN + RemoteWorks = ?Raspberry Pi + AWS + SoftEtherVPN + RemoteWorks = ?
Raspberry Pi + AWS + SoftEtherVPN + RemoteWorks = ?Nobuyuki Matsui
 
20140905 AWS Night in ITHD LT2
20140905 AWS Night in ITHD LT220140905 AWS Night in ITHD LT2
20140905 AWS Night in ITHD LT2Nobuyuki Matsui
 

More from Nobuyuki Matsui (15)

FIWARE勉強会 20190913
FIWARE勉強会 20190913FIWARE勉強会 20190913
FIWARE勉強会 20190913
 
CCSE2019 TIS - 自律移動サービスロボットの地図とデータモデルの共通化への取り組み
CCSE2019 TIS - 自律移動サービスロボットの地図とデータモデルの共通化への取り組みCCSE2019 TIS - 自律移動サービスロボットの地図とデータモデルの共通化への取り組み
CCSE2019 TIS - 自律移動サービスロボットの地図とデータモデルの共通化への取り組み
 
FIWARE-based Robot Management Platform ~ RoboticBase~
FIWARE-based Robot Management Platform ~ RoboticBase~FIWARE-based Robot Management Platform ~ RoboticBase~
FIWARE-based Robot Management Platform ~ RoboticBase~
 
Jazug-8th: Azure AKS & FIWARE & Robot
Jazug-8th: Azure AKS & FIWARE & RobotJazug-8th: Azure AKS & FIWARE & Robot
Jazug-8th: Azure AKS & FIWARE & Robot
 
JTF2018 FIWARE x robot x IoT
JTF2018 FIWARE x robot x IoTJTF2018 FIWARE x robot x IoT
JTF2018 FIWARE x robot x IoT
 
Dockerのネットワークについて
DockerのネットワークについてDockerのネットワークについて
Dockerのネットワークについて
 
【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ
【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ
【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ
 
SoftLayer Bluemix SUMMIT 2015 : Intel Edisonクラスタ x Bluemixによる IoTアプリケーションの実装
SoftLayer Bluemix SUMMIT 2015 : Intel Edisonクラスタ x Bluemixによる IoTアプリケーションの実装SoftLayer Bluemix SUMMIT 2015 : Intel Edisonクラスタ x Bluemixによる IoTアプリケーションの実装
SoftLayer Bluemix SUMMIT 2015 : Intel Edisonクラスタ x Bluemixによる IoTアプリケーションの実装
 
Jtf2015 edison consul_cluster
Jtf2015 edison consul_clusterJtf2015 edison consul_cluster
Jtf2015 edison consul_cluster
 
【第17回八子クラウド座談会 LT】CloudConductor+VDCのご紹介
【第17回八子クラウド座談会 LT】CloudConductor+VDCのご紹介【第17回八子クラウド座談会 LT】CloudConductor+VDCのご紹介
【第17回八子クラウド座談会 LT】CloudConductor+VDCのご紹介
 
【第11回 クラウドごった煮(コンテナ勉強会)】Docker networking tools
【第11回 クラウドごった煮(コンテナ勉強会)】Docker networking tools【第11回 クラウドごった煮(コンテナ勉強会)】Docker networking tools
【第11回 クラウドごった煮(コンテナ勉強会)】Docker networking tools
 
【Tech-Circle #3 & OCDET #7 SDS勉強会】 Ceph on SoftLayer
【Tech-Circle #3 & OCDET #7 SDS勉強会】 Ceph on SoftLayer【Tech-Circle #3 & OCDET #7 SDS勉強会】 Ceph on SoftLayer
【Tech-Circle #3 & OCDET #7 SDS勉強会】 Ceph on SoftLayer
 
【第5回東京SoftLayer勉強会】LT7 SoftLayerでOpenStackを動かしてみた
【第5回東京SoftLayer勉強会】LT7 SoftLayerでOpenStackを動かしてみた【第5回東京SoftLayer勉強会】LT7 SoftLayerでOpenStackを動かしてみた
【第5回東京SoftLayer勉強会】LT7 SoftLayerでOpenStackを動かしてみた
 
Raspberry Pi + AWS + SoftEtherVPN + RemoteWorks = ?
Raspberry Pi + AWS + SoftEtherVPN + RemoteWorks = ?Raspberry Pi + AWS + SoftEtherVPN + RemoteWorks = ?
Raspberry Pi + AWS + SoftEtherVPN + RemoteWorks = ?
 
20140905 AWS Night in ITHD LT2
20140905 AWS Night in ITHD LT220140905 AWS Night in ITHD LT2
20140905 AWS Night in ITHD LT2
 

Recently uploaded

Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdffurutsuka
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 

Recently uploaded (7)

Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 

良いコードとは