SlideShare a Scribd company logo
TEAM BUILDING 39
リーダブルコード
2017.11
為安 圭介
DustinBoswell,TrevorFoucher (著)@オライリージャパン『リーダブルコード』より
私のチームの
目次
1
1. 良いコードとは
2. 名前
3. 整形
4. コメント
5. 制御フローとロジック
6. 変数
7. 標準API
はじめに
2
このスライドを読んで役に立つ人
良いコードの指針を
作りたいチームリーダ
良いコードを書きたい
ITエンジニア
どちらかに当てはまるなら、
これを読めば役に立つ!
あなたはどちら?
3
・・・かもしれない!
4
わたしは
紹介
為安 圭介(ためやす けいすけ)
札幌市在住のITエンジニア
仕事 企業向けWebシステムやスマホAP開発
資格 認定スクラムマスターとかプロマネとか
著書
『強いチームを作るためのたった66の方法』『1200日の朝会で学んだたったひとつのこと』
『自分のことを朕と呼んだらチームが変わった』『ブレイブ・プロジェクトマネジメント』等多数
・・・だと良いな https://www.facebook.com/keisuke.tameyasu
本スライドは、Dustin Boswell, Trevor Foucher (著) @オライリージャパン『リーダブルコード』のまとめです!
本題
5
1
良いコードとは
7
大原則
8
どっちが良いコード?
return exponent >=0 ? mantissa * (1 << exponent) : mantissa / (1 << -exponent);
if (exponent >= 0) {
return mantissa * (1 << exponent);
} else {
return mantissa / (1 << -exponent);
}
(A)
(B)
9
どっちが良いコード?
return exponent >=0 ? mantissa * (1 << exponent) : mantissa / (1 << -exponent);
if (exponent >= 0) {
return mantissa * (1 << exponent);
} else {
return mantissa / (1 << -exponent);
}
(A)
(B) 私のチームでは、こっちを「良いコード」と定義します。
10
鍵となる考え
2
わかりやすい名前をつける
12
どっちが良いコード?
int tmp = 0;
tmp = v[i] * v[i];
int sumSquares = 0;
sumSquares = v[i] * v[i];
(A)
(B)
ある数字の二乗を計算する値
13
どっちが良いコード?
int tmp = 0;
tmp = v[i] * v[i];
int sumSquares = 0;
sumSquares = v[i] * v[i];
(A)
(B) 私のチームでは、こっちを「良いコード」と定義します。
具体的な名前をつける
ある数字の二乗を計算する値
14
名前がバグを教えてくれる
int tmp = 0;
tmp = v[i];
int sumSquares = 0;
sumSquares = v[i];
(A)
(B)
←これはバグ?
15
名前がバグを教えてくれる
int tmp = 0;
tmp = v[i];
int sumSquares = 0;
sumSquares = v[i];
(A)
(B)
←これはバグ!
←これはバグ?
具体的な名前をつける
私のチームでは、こっちを「良いコード」と定義します。
16
どっちが良いコード?
Page getPage();
Page loadPage();
(A)
(B)
ページを外部から読み込み、情報を取得する
17
どっちが良いコード?
Page getPage();
Page loadPage();
(A)
(B) 私のチームでは、こっちを「良いコード」と定義します。
ページを外部から読み込み、情報を取得する
具体的な名前をつける
18
どっちが良いコード?
List<Person> getByName(String name);
List<Person> findByName(String name);
(A)
(B)
名前を使って、ユーザのリストを検索する
19
どっちが良いコード?
List<Person> getByName(String name);
List<Person> findByName(String name);
(A)
(B) 私のチームでは、こっちを「良いコード」と定義します。
名前を使って、ユーザのリストを検索する
具体的な名前をつける
20
どっちが良いコード?
List<Integer> result = new ArrayList<>();
...
return result;
List<Integer> matchedIndexList = new ArrayList<>();
...
return matchedIndexList;
(A)
(B)
文字列のリストの中から、一致したindexのリストを返却する
21
どっちが良いコード?
List<Integer> result = new ArrayList<>();
...
return result;
List<Integer> matchedIndexList = new ArrayList<>();
...
return matchedIndexList;
(A)
(B) 私のチームでは、こっちを「良いコード」と定義します。
文字列のリストの中から、一致したindexのリストを返却する
具体的な名前をつける
22
どっちが良いコード?
class LearningDate {}
class LearningStartDate{}
(A)
(B)
ある期間の開始日(例:学習期間)
23
どっちが良いコード?
class LearningDate {}
class LearningStartDate{}
(A)
(B) 私のチームでは、こっちを「良いコード」と定義します。
ある期間の開始日(例:学習期間)
具体的な名前をつける
24
良い名前とは、誤解されない名前である
明快な単語を選ぶ
 size → height, length, bytes, memoryBytes...
 find → search,locate...
汎用的な名前を避ける
 tmp, retval → 意味のある名前に
 i, j → memberIndex, userIndex, kaishaIndex, soshikiIndex ,ki,si
25
良い名前とは、誤解されない名前である
限界値などの名前は規則を決める
 上下の限界値 min, max
 包含的 first, last
 包含/排他的範囲 begin, end
誤解を招く短い名前より、わかりやすい長い名前を使う
 長い名前の入力は問題ではない ※IDEやエディタが補完してくれる
 stringをstr、documentをdocと省略するのは問題ないが、チーム独自の省略規則は
やめる
3
コードは見やすく整形する
27
どっちが良いコード?
public class PerformanceTester
{
public statc final TcpConnectionSimulator wifi = new TcpConnectionSimulator(
500, /*Kbps*/
80, /*msec latency*/
200,/*jitter*/
1/*packet loss %*/);
public static final TcpConnectionSimulator t3_fibar = new TcpConnectionSimulator(
45000,
10,
0,
0);
public static final TcpConnectionSimulator cell = new TcpConnectionSimulator(
100,
400,
250,
5);
}
(A)
public class PerformanceTester
{
// TcpConnectionSimulator(throughput, latency, jitter, packet_loss)
// [kbps] [ms] [ms] [%]
public statc final TcpConnectionSimulator wifi =
new TcpConnectionSimulator(500, 80, 200,1);
public static final TcpConnectionSimulator t3_fibar =
new TcpConnectionSimulator(45000, 10, 0, 0);
public static final TcpConnectionSimulator cell =
new TcpConnectionSimulator(100, 400, 250, 5);
}
(B)
4つの引数を持つTcpConnectionSimulatorクラスを使って、3つのインスタンスを作る。
1.接続速度(kbps) 2.平均遅延時間(msec) 3.遅延時間(msec) 4.パケットロス率(percent,%)
28
どっちが良いコード?
public class PerformanceTester
{
public statc final TcpConnectionSimulator wifi = new TcpConnectionSimulator(
500, /*Kbps*/
80, /*msec latency*/
200,/*jitter*/
1/*packet loss %*/);
public static final TcpConnectionSimulator t3_fibar = new TcpConnectionSimulator(
45000,
10,
0,
0);
public static final TcpConnectionSimulator cell = new TcpConnectionSimulator(
100,
400,
250,
5);
}
(A)
public class PerformanceTester
{
// TcpConnectionSimulator(throughput, latency, jitter, packet_loss)
// [kbps] [ms] [ms] [%]
public statc final TcpConnectionSimulator wifi =
new TcpConnectionSimulator(500, 80, 200,1);
public static final TcpConnectionSimulator t3_fibar =
new TcpConnectionSimulator(45000, 10, 0, 0);
public static final TcpConnectionSimulator cell =
new TcpConnectionSimulator(100, 400, 250, 5);
}
(B)
4つの引数を持つTcpConnectionSimulatorクラスを使って、3つのインスタンスを作る。
1.接続速度(kbps) 2.平均遅延時間(msec) 3.遅延時間(msec) 4.パケットロス率(percent,%)
シルエットを意識する
29
どっちが良いコード?
CheckFullName("doug Adams","Mr.Doglas Adams","");
CheckFullName("Jake Brown","Mr. Jake Brown III","");
CheckFullName("No such Guy","","no match found");
CheckFullName("John","","more than one result");
CheckFullName("doug Adams" ,"Mr.Doglas Adams" ,"");
CheckFullName("Jake Brown" ,"Mr. Jake Brown III" ,"");
CheckFullName("No such Guy" ,"" ,"no match found");
CheckFullName("John" ,"" ,"more than one result");
(A)
(B)
30
どっちが良いコード?
CheckFullName("doug Adams","Mr.Doglas Adams","");
CheckFullName("Jake Brown","Mr. Jake Brown III","");
CheckFullName("No such Guy","","no match found");
CheckFullName("John","","more than one result");
CheckFullName("doug Adams" ,"Mr.Doglas Adams" ,"");
CheckFullName("Jake Brown" ,"Mr. Jake Brown III" ,"");
CheckFullName("No such Guy" ,"" ,"no match found");
CheckFullName("John" ,"" ,"more than one result");
(A)
(B) 私のチームでは、こっちを「良いコード」と定義・・・できるかどうか微妙。
シルエットを意識する
31
一貫性と意味のあるルールでコードを整形する
複数のブロックで似たようなことをしていたら、
シルエットを揃える
 コードの「列」を揃える
並び順を揃える
 ある場所で a, b ,c と並んでいたものは、別の場所でも a, b ,c と並べる
ブロックにまとめる
 空行とコメントでブロックを「段落」に分ける
書き手の意図がわかるように
コメントをつける
4
33
どっちが良いコード?
// 文字列を;で分割する
String[] splitStr = str.split(“;”, 0);
String[] splitStr = str.split(“;”, 0);
(A)
(B)
34
どっちが良いコード?
// 文字列を;で分割する
String[] splitStr = str.split(“;”, 0);
String[] splitStr = str.split(“;”, 0);
(A)
(B) 私のチームでは、こっちを「良いコード」と定義します。
見ればわかるものをコメントしない
35
どっちが良いコード?
NUM_THREADS = 8;
NUM_THREADS = 8; // 値は「num_processorsの2倍程度で十分」
(A)
(B)
36
どっちが良いコード?
NUM_THREADS = 8;
NUM_THREADS = 8; // 値は「num_processorsの2倍程度で十分」
(A)
(B) 私のチームでは、こっちを「良いコード」と定義します。
自分の考えを記しておく
37
コメント
コメントすべきではないこと
 コードを見ればすぐにわかるようなこと
 ひどいコードを補うコメント(コードを直接修正する)
 誤解を与える表現(代名詞)
自分の考えを記録する
 なぜこの書き方なのか
 どうしてこの定数はこの値なのか
読み手の立場になる
 コードの読み手が驚くような処理はコメントしておく
 ブロック単位でコメントをつける
制御フローを読みやすくする
5
39
どっちが良いコード?
if (10 < length) {
if (length > 10) {
(A)
(B)
「もし10がその長さより小さいなら・・・」
「もしその長さが10より大きいなら・・・」
40
どっちが良いコード?
if (10 < length) {
if (length > 10) {
(A)
(B) 私のチームでは、こっちを「良いコード」と定義します。
「もし10がその長さより小さいなら・・・」
「もしその長さが10より大きいなら・・・」
変化する値を左に、固定値を右に
41
どっちが良いコード?
while( 1024 > receivedBytes){
while(receivedBytes < 1024 ){
(A)
(B)
42
どっちが良いコード?
while( 1024 > receivedBytes){
while(receivedBytes < 1024 ){
(A)
(B) 私のチームでは、こっちを「良いコード」と定義します。
変化する値を左に、固定値を右に
43
どっちが良いコード?
if (!user.hasAuthority()) {
// 権限なしの処理
} else {
// 権限ありの処理
}
if (user.hasAuthority()){
// 権限ありの処理
} else {
// 権限なしの処理
}
(A)
(B)
44
どっちが良いコード?
if (!user.hasAuthority()) {
// 権限なしの処理
} else {
// 権限ありの処理
}
if (user.hasAuthority()){
// 権限ありの処理
} else {
// 権限なしの処理
}
(A)
(B) 私のチームでは、こっちを「良いコード」と定義します。
if文の条件はできるだけ素直に
45
どっちが良いコード?
if(userResult == true)
{
if(permissionResult != true)
{
reply.writeErrors("permissions error");
reply.done();
return;
}
}
reply.writeErrors("");
reply.done();
(A)
if (!userResult) {
reply.writeErrors(“”);
reply.done();
return;
}
if (!permissionResult) {
reply.writeErrors(“permissions error”);
reply.done();
return;
}
reply.writeErrors("");
reply.done();
(B)
46
どっちが良いコード?
if(userResult == true)
{
if(permissionResult != true)
{
reply.writeErrors("permissions error");
reply.done();
return;
}
}
reply.writeErrors("");
reply.done();
(A)
if (!userResult) {
reply.writeErrors(“”);
reply.done();
return;
}
if (!permissionResult) {
reply.writeErrors(“permissions error”);
reply.done();
return;
}
reply.writeErrors("");
reply.done();
(B)
私のチームでは、こっちを
「良いコード」と定義します。
ガード節を使う
47
制御フローを読みやすくする
比較を書くときは、変化する値を左に、安定した値を右に
 if (length >= 10) よりも if (10 <= length)
処理の順番
 肯定形で書く
 単純な条件を先に書く
ネストを浅く
 ガード節を使う
 特別なケースはすぐにreturn
6
変数を扱いやすくする
49
どっちが良いコード?
Date now = daytime.now();
System.out.println(now);
System.out.println(daytime.now());
(A)
(B)
50
どっちが良いコード?
Date now = daytime.now();
System.out.println(now);
System.out.println(daytime.now());
(A)
(B) 私のチームでは、こっちを「良いコード」と定義します。
より明確にならない変数は定義しない
51
どっちが良いコード?
class LargeClass{
String str;
void method1(){
str = ...;
method2();
}
void method2(){
System.println(str) ;
}
void methodOther(){
・・・
・・・
}
}
(A)
class LargeClass {
void method1() {
String str = ...;
method2(str);
}
void method2(String str) {
System.println(str) ;
}
void methodOther() {
・・・
}
}
(B)
←strを使う
←strを使う
←以降、strを使わない記述が続く
←strを使う
←strを使う
←以降のメソッドは、strが見えない
52
どっちが良いコード?
class LargeClass{
String str;
void method1(){
str = ...;
method2();
}
void method2(){
System.println(str) ;
}
void methodOther(){
・・・
・・・
}
}
(A)
class LargeClass {
void method1() {
String str = ...;
method2(str);
}
void method2(String str) {
System.println(str) ;
}
void methodOther() {
・・・
}
}
(B)
私のチームでは、こっちを
「良いコード」と定義します。
←strを使う
←strを使う
←以降、strを使わない記述が続く
←strを使う
←strを使う
←以降のメソッドは、strが見えない
変数のスコープを縮める
53
どっちが良いコード?
<script>
var f = function(){
for( i = 0; i < 10 ; i += 1 )...
};
f();
</script>
<script>
alert(i);
</script>
(A)
<script>
var f = function(){
for( var i = 0; i < 10 ; i += 1 )...
};
f();
</script>
<script>
alert(i);
</script>
(B)
←10が表示される ←undefined
54
どっちが良いコード?
<script>
var f = function(){
for( i = 0; i < 10 ; i += 1 )...
};
f();
</script>
<script>
alert(i);
</script>
(A)
<script>
var f = function(){
for( var i = 0; i < 10 ; i += 1 )...
};
f();
</script>
<script>
alert(i);
</script>
(B)
私のチームでは、こっちを
「良いコード」と定義します。
変数のスコープを縮める
←10が表示される ←undefined
55
変数
役に立たない変数は削除する
 複雑な式を分割していない変数は使わない
 より明確にならない変数は使わない
変数のスコープを縮める
 ローカル→インスタンス→グローバル
 変数のことが見えるコード行数はできるだけ減らす
7
コーディング量を減らす
57
鍵となる考え方
58
定期的にAPIを読んで、標準ライブラリに慣れておく
標準APIを使う
汎用的なユーティリティコードを作って重複コードを
削除する
広く使われている外部ライブラリ(Apache Commons
など)にあるような機能をオレオレ実装しない
おわり
TEAM BUILDING 39
SpecialThanks To
S.T, A.K, E.O, S.S, T.U
Y.Y
60
参考文献
• Dustin Boswell, Trevor Foucher (著) @オライリージャパン「リーダブルコード」
• 上田勲 (著)@秀和システム「プリンシプル オブ プログラミング」
• こざき亜衣@小学館「あさひなぐ」15巻
• こざき亜衣@小学館「あさひなぐ」16巻
• こざき亜衣@小学館「あさひなぐ」17巻
• こざき亜衣@小学館「あさひなぐ」18巻

More Related Content

What's hot

TIS 戦略技術センター AI技術推進室紹介
TIS 戦略技術センター AI技術推進室紹介TIS 戦略技術センター AI技術推進室紹介
TIS 戦略技術センター AI技術推進室紹介
Takahiro Kubo
 
物体検出フレームワークMMDetectionで快適な開発
物体検出フレームワークMMDetectionで快適な開発物体検出フレームワークMMDetectionで快適な開発
物体検出フレームワークMMDetectionで快適な開発
Tatsuya Suzuki
 
[DL輪読会]Libra R-CNN: Towards Balanced Learning for Object Detection
[DL輪読会]Libra R-CNN: Towards Balanced Learning for Object Detection[DL輪読会]Libra R-CNN: Towards Balanced Learning for Object Detection
[DL輪読会]Libra R-CNN: Towards Balanced Learning for Object Detection
Deep Learning JP
 
カメラ間人物照合サーベイ
カメラ間人物照合サーベイカメラ間人物照合サーベイ
カメラ間人物照合サーベイYoshihisa Ijiri
 
Spring Framework ふりかえりと4.3新機能
Spring Framework ふりかえりと4.3新機能Spring Framework ふりかえりと4.3新機能
Spring Framework ふりかえりと4.3新機能
kimulla
 
楽天における機械学習アルゴリズムの活用
楽天における機械学習アルゴリズムの活用楽天における機械学習アルゴリズムの活用
楽天における機械学習アルゴリズムの活用
Rakuten Group, Inc.
 
僕たちがすべきことはリファクタリングなのか
僕たちがすべきことはリファクタリングなのか僕たちがすべきことはリファクタリングなのか
僕たちがすべきことはリファクタリングなのか
Ito Takumi
 
リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介
Recruit Technologies
 
SSII2020TS: 機械学習モデルの判断根拠の説明​ 〜 Explainable AI 研究の近年の展開 〜​
SSII2020TS: 機械学習モデルの判断根拠の説明​ 〜 Explainable AI 研究の近年の展開 〜​SSII2020TS: 機械学習モデルの判断根拠の説明​ 〜 Explainable AI 研究の近年の展開 〜​
SSII2020TS: 機械学習モデルの判断根拠の説明​ 〜 Explainable AI 研究の近年の展開 〜​
SSII
 
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころPython におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころ
Junya Hayashi
 
RailsでのREST API開発の知見共有
RailsでのREST API開発の知見共有RailsでのREST API開発の知見共有
RailsでのREST API開発の知見共有
Yusuke Kon
 
超複素数
超複素数超複素数
超複素数
Horiguchi Shuhei
 
[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...
[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...
[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...
de:code 2017
 
技術的負債を生み出す構造とその対処について
技術的負債を生み出す構造とその対処について技術的負債を生み出す構造とその対処について
技術的負債を生み出す構造とその対処について
Masahiro Nishimi
 
トップカンファレンスへの論文採択に向けて(AI研究分野版)/ Toward paper acceptance at top conferences (AI...
トップカンファレンスへの論文採択に向けて(AI研究分野版)/ Toward paper acceptance at top conferences (AI...トップカンファレンスへの論文採択に向けて(AI研究分野版)/ Toward paper acceptance at top conferences (AI...
トップカンファレンスへの論文採択に向けて(AI研究分野版)/ Toward paper acceptance at top conferences (AI...
JunSuzuki21
 
個人/グループサーベイ法(早稲田大学講演)
個人/グループサーベイ法(早稲田大学講演)個人/グループサーベイ法(早稲田大学講演)
個人/グループサーベイ法(早稲田大学講演)
cvpaper. challenge
 
Pythonによる機械学習入門 ~SVMからDeep Learningまで~
Pythonによる機械学習入門 ~SVMからDeep Learningまで~Pythonによる機械学習入門 ~SVMからDeep Learningまで~
Pythonによる機械学習入門 ~SVMからDeep Learningまで~
Yasutomo Kawanishi
 
CVPR 2015 読み会 "Understanding Deep Image Representations by Inverting Them"
CVPR 2015 読み会 "Understanding Deep Image Representations by Inverting Them"CVPR 2015 読み会 "Understanding Deep Image Representations by Inverting Them"
CVPR 2015 読み会 "Understanding Deep Image Representations by Inverting Them"
Hiroharu Kato
 
Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化
Yusuke Fujimoto
 
Materials Informatics and Python
Materials Informatics and PythonMaterials Informatics and Python
Materials Informatics and Python
Shintaro Fukushima
 

What's hot (20)

TIS 戦略技術センター AI技術推進室紹介
TIS 戦略技術センター AI技術推進室紹介TIS 戦略技術センター AI技術推進室紹介
TIS 戦略技術センター AI技術推進室紹介
 
物体検出フレームワークMMDetectionで快適な開発
物体検出フレームワークMMDetectionで快適な開発物体検出フレームワークMMDetectionで快適な開発
物体検出フレームワークMMDetectionで快適な開発
 
[DL輪読会]Libra R-CNN: Towards Balanced Learning for Object Detection
[DL輪読会]Libra R-CNN: Towards Balanced Learning for Object Detection[DL輪読会]Libra R-CNN: Towards Balanced Learning for Object Detection
[DL輪読会]Libra R-CNN: Towards Balanced Learning for Object Detection
 
カメラ間人物照合サーベイ
カメラ間人物照合サーベイカメラ間人物照合サーベイ
カメラ間人物照合サーベイ
 
Spring Framework ふりかえりと4.3新機能
Spring Framework ふりかえりと4.3新機能Spring Framework ふりかえりと4.3新機能
Spring Framework ふりかえりと4.3新機能
 
楽天における機械学習アルゴリズムの活用
楽天における機械学習アルゴリズムの活用楽天における機械学習アルゴリズムの活用
楽天における機械学習アルゴリズムの活用
 
僕たちがすべきことはリファクタリングなのか
僕たちがすべきことはリファクタリングなのか僕たちがすべきことはリファクタリングなのか
僕たちがすべきことはリファクタリングなのか
 
リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介
 
SSII2020TS: 機械学習モデルの判断根拠の説明​ 〜 Explainable AI 研究の近年の展開 〜​
SSII2020TS: 機械学習モデルの判断根拠の説明​ 〜 Explainable AI 研究の近年の展開 〜​SSII2020TS: 機械学習モデルの判断根拠の説明​ 〜 Explainable AI 研究の近年の展開 〜​
SSII2020TS: 機械学習モデルの判断根拠の説明​ 〜 Explainable AI 研究の近年の展開 〜​
 
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころPython におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころ
 
RailsでのREST API開発の知見共有
RailsでのREST API開発の知見共有RailsでのREST API開発の知見共有
RailsでのREST API開発の知見共有
 
超複素数
超複素数超複素数
超複素数
 
[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...
[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...
[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...
 
技術的負債を生み出す構造とその対処について
技術的負債を生み出す構造とその対処について技術的負債を生み出す構造とその対処について
技術的負債を生み出す構造とその対処について
 
トップカンファレンスへの論文採択に向けて(AI研究分野版)/ Toward paper acceptance at top conferences (AI...
トップカンファレンスへの論文採択に向けて(AI研究分野版)/ Toward paper acceptance at top conferences (AI...トップカンファレンスへの論文採択に向けて(AI研究分野版)/ Toward paper acceptance at top conferences (AI...
トップカンファレンスへの論文採択に向けて(AI研究分野版)/ Toward paper acceptance at top conferences (AI...
 
個人/グループサーベイ法(早稲田大学講演)
個人/グループサーベイ法(早稲田大学講演)個人/グループサーベイ法(早稲田大学講演)
個人/グループサーベイ法(早稲田大学講演)
 
Pythonによる機械学習入門 ~SVMからDeep Learningまで~
Pythonによる機械学習入門 ~SVMからDeep Learningまで~Pythonによる機械学習入門 ~SVMからDeep Learningまで~
Pythonによる機械学習入門 ~SVMからDeep Learningまで~
 
CVPR 2015 読み会 "Understanding Deep Image Representations by Inverting Them"
CVPR 2015 読み会 "Understanding Deep Image Representations by Inverting Them"CVPR 2015 読み会 "Understanding Deep Image Representations by Inverting Them"
CVPR 2015 読み会 "Understanding Deep Image Representations by Inverting Them"
 
Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化
 
Materials Informatics and Python
Materials Informatics and PythonMaterials Informatics and Python
Materials Informatics and Python
 

Similar to 私のチームのリーダブルコード

Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
Tomoya Nakayama
 
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
 
エヌビディアが加速するディープラーニング ~進化するニューラルネットワークとその開発方法について~
エヌビディアが加速するディープラーニング ~進化するニューラルネットワークとその開発方法について~エヌビディアが加速するディープラーニング ~進化するニューラルネットワークとその開発方法について~
エヌビディアが加速するディープラーニング ~進化するニューラルネットワークとその開発方法について~
NVIDIA Japan
 
DTrace for biginners part(2)
DTrace for biginners part(2)DTrace for biginners part(2)
DTrace for biginners part(2)
Shoji Haraguchi
 
NINと画像分類 for 人工知能LT祭
NINと画像分類 for 人工知能LT祭NINと画像分類 for 人工知能LT祭
NINと画像分類 for 人工知能LT祭
t dev
 
Stan勉強会資料(前編)
Stan勉強会資料(前編) Stan勉強会資料(前編)
Stan勉強会資料(前編)
daiki hojo
 
ソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビューソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビューMoriharu Ohzu
 
Janog31 bof-pattern-sasaki-01
Janog31 bof-pattern-sasaki-01Janog31 bof-pattern-sasaki-01
Janog31 bof-pattern-sasaki-01
Ken SASAKI
 
Jubatusでマルウェア分類
Jubatusでマルウェア分類Jubatusでマルウェア分類
Jubatusでマルウェア分類
Shuzo Kashihara
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門伸男 伊藤
 
Parquetはカラムナなのか?
Parquetはカラムナなのか?Parquetはカラムナなのか?
Parquetはカラムナなのか?
Yohei Azekatsu
 
Sourcecode Reading Workshop2010
Sourcecode Reading Workshop2010Sourcecode Reading Workshop2010
Sourcecode Reading Workshop2010
Hiro Yoshioka
 
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2Masatoshi Tada
 
The rethinkingofrepair
The rethinkingofrepairThe rethinkingofrepair
The rethinkingofrepair
Kazutaka Tomita
 
Databricksを初めて使う人に向けて.pptx
Databricksを初めて使う人に向けて.pptxDatabricksを初めて使う人に向けて.pptx
Databricksを初めて使う人に向けて.pptx
otato
 
PostgreSQL13 新機能紹介
PostgreSQL13 新機能紹介PostgreSQL13 新機能紹介
PostgreSQL13 新機能紹介
Satoshi Hirata
 
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
Hirotaka Kawata
 

Similar to 私のチームのリーダブルコード (20)

Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
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 プログラマーのための機械学習入門
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
エヌビディアが加速するディープラーニング ~進化するニューラルネットワークとその開発方法について~
エヌビディアが加速するディープラーニング ~進化するニューラルネットワークとその開発方法について~エヌビディアが加速するディープラーニング ~進化するニューラルネットワークとその開発方法について~
エヌビディアが加速するディープラーニング ~進化するニューラルネットワークとその開発方法について~
 
第28回Tokyo.R
第28回Tokyo.R第28回Tokyo.R
第28回Tokyo.R
 
DTrace for biginners part(2)
DTrace for biginners part(2)DTrace for biginners part(2)
DTrace for biginners part(2)
 
NINと画像分類 for 人工知能LT祭
NINと画像分類 for 人工知能LT祭NINと画像分類 for 人工知能LT祭
NINと画像分類 for 人工知能LT祭
 
Stan勉強会資料(前編)
Stan勉強会資料(前編) Stan勉強会資料(前編)
Stan勉強会資料(前編)
 
ソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビューソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビュー
 
Janog31 bof-pattern-sasaki-01
Janog31 bof-pattern-sasaki-01Janog31 bof-pattern-sasaki-01
Janog31 bof-pattern-sasaki-01
 
Jubatusでマルウェア分類
Jubatusでマルウェア分類Jubatusでマルウェア分類
Jubatusでマルウェア分類
 
Boost Tour 1.50.0 All
Boost Tour 1.50.0 AllBoost Tour 1.50.0 All
Boost Tour 1.50.0 All
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 
Parquetはカラムナなのか?
Parquetはカラムナなのか?Parquetはカラムナなのか?
Parquetはカラムナなのか?
 
Sourcecode Reading Workshop2010
Sourcecode Reading Workshop2010Sourcecode Reading Workshop2010
Sourcecode Reading Workshop2010
 
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
 
The rethinkingofrepair
The rethinkingofrepairThe rethinkingofrepair
The rethinkingofrepair
 
Databricksを初めて使う人に向けて.pptx
Databricksを初めて使う人に向けて.pptxDatabricksを初めて使う人に向けて.pptx
Databricksを初めて使う人に向けて.pptx
 
PostgreSQL13 新機能紹介
PostgreSQL13 新機能紹介PostgreSQL13 新機能紹介
PostgreSQL13 新機能紹介
 
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
 

More from Keisuke Tameyasu

ふりかえりを1枚で実施できる新フレームワーク(アジャイルレトロスペクティブズ2)
ふりかえりを1枚で実施できる新フレームワーク(アジャイルレトロスペクティブズ2)ふりかえりを1枚で実施できる新フレームワーク(アジャイルレトロスペクティブズ2)
ふりかえりを1枚で実施できる新フレームワーク(アジャイルレトロスペクティブズ2)
Keisuke Tameyasu
 
CDLE コミュニティ活動紹介(CDLE DAY 2022秋)
CDLE コミュニティ活動紹介(CDLE DAY 2022秋)CDLE コミュニティ活動紹介(CDLE DAY 2022秋)
CDLE コミュニティ活動紹介(CDLE DAY 2022秋)
Keisuke Tameyasu
 
人材版伊藤レポートサマリ.pptx
人材版伊藤レポートサマリ.pptx人材版伊藤レポートサマリ.pptx
人材版伊藤レポートサマリ.pptx
Keisuke Tameyasu
 
ITエンジニアの情報キャッチアップ法
ITエンジニアの情報キャッチアップ法ITエンジニアの情報キャッチアップ法
ITエンジニアの情報キャッチアップ法
Keisuke Tameyasu
 
インプットとアウトプットのサイクルを回すプライベートシステム
インプットとアウトプットのサイクルを回すプライベートシステムインプットとアウトプットのサイクルを回すプライベートシステム
インプットとアウトプットのサイクルを回すプライベートシステム
Keisuke Tameyasu
 
Deta-Centric AI
Deta-Centric AIDeta-Centric AI
Deta-Centric AI
Keisuke Tameyasu
 
3rdCOMMUNITYを創る
3rdCOMMUNITYを創る3rdCOMMUNITYを創る
3rdCOMMUNITYを創る
Keisuke Tameyasu
 
気になるAI需要予測発注サービスとサービス提供企業
気になるAI需要予測発注サービスとサービス提供企業気になるAI需要予測発注サービスとサービス提供企業
気になるAI需要予測発注サービスとサービス提供企業
Keisuke Tameyasu
 
CDLE VIEW(2022.3.26 CDLE DAY2022春)
CDLE VIEW(2022.3.26 CDLE DAY2022春)CDLE VIEW(2022.3.26 CDLE DAY2022春)
CDLE VIEW(2022.3.26 CDLE DAY2022春)
Keisuke Tameyasu
 
CDLE VIEW(2021.11.27 CDLE DAY2021秋)
CDLE VIEW(2021.11.27 CDLE DAY2021秋)CDLE VIEW(2021.11.27 CDLE DAY2021秋)
CDLE VIEW(2021.11.27 CDLE DAY2021秋)
Keisuke Tameyasu
 
CDLE VIEW(2020.11.28 CDLE DAY2020)
CDLE VIEW(2020.11.28 CDLE DAY2020)CDLE VIEW(2020.11.28 CDLE DAY2020)
CDLE VIEW(2020.11.28 CDLE DAY2020)
Keisuke Tameyasu
 
ITエンジニアのためのAI基礎2020
ITエンジニアのためのAI基礎2020ITエンジニアのためのAI基礎2020
ITエンジニアのためのAI基礎2020
Keisuke Tameyasu
 
GRIT TEAMS -執着心をもってやり抜くチームの作り方
GRIT TEAMS -執着心をもってやり抜くチームの作り方GRIT TEAMS -執着心をもってやり抜くチームの作り方
GRIT TEAMS -執着心をもってやり抜くチームの作り方
Keisuke Tameyasu
 
今さら聞けないITエンジニアのためのドラッカー
今さら聞けないITエンジニアのためのドラッカー今さら聞けないITエンジニアのためのドラッカー
今さら聞けないITエンジニアのためのドラッカー
Keisuke Tameyasu
 
今さら聞けないITエンジニアのための7つの習慣
今さら聞けないITエンジニアのための7つの習慣今さら聞けないITエンジニアのための7つの習慣
今さら聞けないITエンジニアのための7つの習慣
Keisuke Tameyasu
 
今さら聞けないITエンジニアのための管理会計
今さら聞けないITエンジニアのための管理会計今さら聞けないITエンジニアのための管理会計
今さら聞けないITエンジニアのための管理会計
Keisuke Tameyasu
 
今さら聞けないITエンジニアのための人工知能
今さら聞けないITエンジニアのための人工知能今さら聞けないITエンジニアのための人工知能
今さら聞けないITエンジニアのための人工知能
Keisuke Tameyasu
 
十二国記に学ぶ自分の心づくり
十二国記に学ぶ自分の心づくり十二国記に学ぶ自分の心づくり
十二国記に学ぶ自分の心づくり
Keisuke Tameyasu
 
チーム内で100%発生する問題に真正面から取り組む方法
チーム内で100%発生する問題に真正面から取り組む方法チーム内で100%発生する問題に真正面から取り組む方法
チーム内で100%発生する問題に真正面から取り組む方法
Keisuke Tameyasu
 
振り返り(アジャイルレトロスペクティブズ)
振り返り(アジャイルレトロスペクティブズ)振り返り(アジャイルレトロスペクティブズ)
振り返り(アジャイルレトロスペクティブズ)
Keisuke Tameyasu
 

More from Keisuke Tameyasu (20)

ふりかえりを1枚で実施できる新フレームワーク(アジャイルレトロスペクティブズ2)
ふりかえりを1枚で実施できる新フレームワーク(アジャイルレトロスペクティブズ2)ふりかえりを1枚で実施できる新フレームワーク(アジャイルレトロスペクティブズ2)
ふりかえりを1枚で実施できる新フレームワーク(アジャイルレトロスペクティブズ2)
 
CDLE コミュニティ活動紹介(CDLE DAY 2022秋)
CDLE コミュニティ活動紹介(CDLE DAY 2022秋)CDLE コミュニティ活動紹介(CDLE DAY 2022秋)
CDLE コミュニティ活動紹介(CDLE DAY 2022秋)
 
人材版伊藤レポートサマリ.pptx
人材版伊藤レポートサマリ.pptx人材版伊藤レポートサマリ.pptx
人材版伊藤レポートサマリ.pptx
 
ITエンジニアの情報キャッチアップ法
ITエンジニアの情報キャッチアップ法ITエンジニアの情報キャッチアップ法
ITエンジニアの情報キャッチアップ法
 
インプットとアウトプットのサイクルを回すプライベートシステム
インプットとアウトプットのサイクルを回すプライベートシステムインプットとアウトプットのサイクルを回すプライベートシステム
インプットとアウトプットのサイクルを回すプライベートシステム
 
Deta-Centric AI
Deta-Centric AIDeta-Centric AI
Deta-Centric AI
 
3rdCOMMUNITYを創る
3rdCOMMUNITYを創る3rdCOMMUNITYを創る
3rdCOMMUNITYを創る
 
気になるAI需要予測発注サービスとサービス提供企業
気になるAI需要予測発注サービスとサービス提供企業気になるAI需要予測発注サービスとサービス提供企業
気になるAI需要予測発注サービスとサービス提供企業
 
CDLE VIEW(2022.3.26 CDLE DAY2022春)
CDLE VIEW(2022.3.26 CDLE DAY2022春)CDLE VIEW(2022.3.26 CDLE DAY2022春)
CDLE VIEW(2022.3.26 CDLE DAY2022春)
 
CDLE VIEW(2021.11.27 CDLE DAY2021秋)
CDLE VIEW(2021.11.27 CDLE DAY2021秋)CDLE VIEW(2021.11.27 CDLE DAY2021秋)
CDLE VIEW(2021.11.27 CDLE DAY2021秋)
 
CDLE VIEW(2020.11.28 CDLE DAY2020)
CDLE VIEW(2020.11.28 CDLE DAY2020)CDLE VIEW(2020.11.28 CDLE DAY2020)
CDLE VIEW(2020.11.28 CDLE DAY2020)
 
ITエンジニアのためのAI基礎2020
ITエンジニアのためのAI基礎2020ITエンジニアのためのAI基礎2020
ITエンジニアのためのAI基礎2020
 
GRIT TEAMS -執着心をもってやり抜くチームの作り方
GRIT TEAMS -執着心をもってやり抜くチームの作り方GRIT TEAMS -執着心をもってやり抜くチームの作り方
GRIT TEAMS -執着心をもってやり抜くチームの作り方
 
今さら聞けないITエンジニアのためのドラッカー
今さら聞けないITエンジニアのためのドラッカー今さら聞けないITエンジニアのためのドラッカー
今さら聞けないITエンジニアのためのドラッカー
 
今さら聞けないITエンジニアのための7つの習慣
今さら聞けないITエンジニアのための7つの習慣今さら聞けないITエンジニアのための7つの習慣
今さら聞けないITエンジニアのための7つの習慣
 
今さら聞けないITエンジニアのための管理会計
今さら聞けないITエンジニアのための管理会計今さら聞けないITエンジニアのための管理会計
今さら聞けないITエンジニアのための管理会計
 
今さら聞けないITエンジニアのための人工知能
今さら聞けないITエンジニアのための人工知能今さら聞けないITエンジニアのための人工知能
今さら聞けないITエンジニアのための人工知能
 
十二国記に学ぶ自分の心づくり
十二国記に学ぶ自分の心づくり十二国記に学ぶ自分の心づくり
十二国記に学ぶ自分の心づくり
 
チーム内で100%発生する問題に真正面から取り組む方法
チーム内で100%発生する問題に真正面から取り組む方法チーム内で100%発生する問題に真正面から取り組む方法
チーム内で100%発生する問題に真正面から取り組む方法
 
振り返り(アジャイルレトロスペクティブズ)
振り返り(アジャイルレトロスペクティブズ)振り返り(アジャイルレトロスペクティブズ)
振り返り(アジャイルレトロスペクティブズ)
 

私のチームのリーダブルコード