2025年1月5日日曜日

Tidy First?を読んで

本書はアジャイル開発を行っているプロジェクトで、より効果のある内容となっていました。


V字開発では、要件→設計→実装と行うことで、整理されたシステムが作られることを副産物として開発が進むことを想定している。
また開発されたシステムは改修を頻繁に行うことを想定しておらず、追加開発時にはまたV字開発としての工程を進むこととなる。
その際に、整頓を入れるのは工程上は不可視化されているが、開発工程時に含まれているが、この整頓に関する工数をマネージャが想定していないことが多いため、整頓するプロジェクトが起こるか(バージョンアップなどのプロジェクトで)、システムの寿命として、別のシステムを再構築することで、すべての技術負債が生産される。

そのため、技術負債の概念が薄く、継続的なサービスの構築と改修によって俗人的で考慮事項が多く、検証範囲が広いシステムとなってしまう。

本書では、継続的インテグレーションを続けるにあたり、整頓を行うTipsやパターンの説明や、開発時に振る舞いを構築する作業を行うのか、整頓をする作業を行うかの判断やタイミングなど、実装したコードを整頓していくことのノウハウが記述されています。

アジャイル開発においては、プログラムの定期的な修正を行わない場合は、技術負債として期間が進むにつれて、振る舞いの実装量が低下していき、プログラムからのバグの発生率が上がってしまう問題に直面する。

そのため、技術負債が増えすぎないために、オブジェクトの構造設計の工夫や、言語での制約による問題の確認(静的型やフレームワークの規約)、読みやすさなど、各種考慮事項を汲み入れて開発をする必要がある。

整頓というのは、システム上の動作として大きな変更があるわけではない。読みやすさや、影響範囲のコントロール。拡張性などをプログラムの構造や記述の変更を行い実現する行為となり。
プログラマーが次に開発するときに利便性を上げるための作業になる。

まず整頓するのか?
この本を読むことで解像度が上がるので、アジャイル開発での開発者やPO、スクラムマスターにお勧めしたい。

2021年1月13日水曜日

新入社員向けスクラムゲーム

 # 新入社員向けスクラムゲーム


認定スクラムマスターを取得した2019年に、新入社員(11人)向けのアジャイル開発の研修をしてほしいと社内で依頼がありました。

11人のメンバーはプログラムを大学で書いていたメンバーが5人であとはIT技術は素人でJavaの研修を受けたくらいです。


研修の内容は業務の内容とは関係なく、登場人物も仮称を利用させていただきます(僕以外は)。


研修の概要は以下のような感じです。


+ 単価マスターと売上情報を掛け合わせるような販売管理システムの構築

+ 社会人の開発者であれば1日か2日あれば作れるような内容

+ 4日間の作業研修で半日(3時間)が1スプリント

+ 1スプリント終了後に30分のスプリントレトロスペクティブを行う

+ 要件書類に不備がある(質問すると正しい答えを教えてもらえる)

+ スプリント中に30分だけステークホルダ役への質問タイムがある

+ 5回めのスプリントでステークホルダの要望が追加される

+ 開発言語はユニケージ(何でもいいと思います)


開発言語が特殊で2日間ほどの研修を、アジャイル開発研修の前に行っていましたが、メンバーの中ではまだ経験が浅く、言語習得はまちまちな状態でした。


作業前に1日かけてスクラム開発の教育を行いました。

作業前のブリーフィングの様な感じです。


最初に技術力順に自己申告で並んでもらって、チーム編成をしました。

チームは3チームです。


Aチーム

一番技術力があるとされるメンバーが所属し、その代わりにメンバーは3人チーム


Bチーム

特に誰かが突出しているわけじゃない4人チーム


Cチーム

一人目立つメンバーがいるが、それ以外はおとなしい4人チーム


開始初日の動向


+ すべてのチームがチームの要のメンバーを中心に作業を行う

+ PBIをポストイットに記述して貼る作業を行っていない。

+ とにかく実装を行う(調査や情報の整理を行わない)


初日の動向を見てのフィードバックとして以下のような助言を行いました。


+ メンバー全員が効率的に動けるように業務分担する

+ PBIを必ず記述し調査や質問事項などもPBIで記述してホワイトボードに貼る

+ 初日のブリーフィングで教えたスプリントで必要とされるミーティング(プランニング、レビュー)などの実行を行う

+ PBIの作業コストはぼんやりでもいいので予想しておく


翌日の時点でBチームが初日の作業もPBIも捨てて作業し始めました。

勇気のいる行為でしたが、Bチームは誰かがメインで作業を行っていたA,Cと比べても目に見えて作業ができていなかったので、英断だったと思います。


Aチームは完全に技術力のあるメンバーがメインで動いていて、実装をゴリゴリに作成している感じでした。

他の二名は必要そうな設計などを調べていましたが、あまりメインで動いているメンバーと息があっている感じではなかったです。


Cチームもきっちりできるメンバーに頼り切りの場面が多くなっていました。


2日目を終えて折り返しでしたが、この時点で要件を満たしてしまうチームはいませんでした。

弊社に入社してくるレベルだと学生で突出した技術力のあるメンバーが居ることは少ないため今回の結果は妥当でした。


2日目のフィードバックとして


+ 作業中のメンバーは作業中のPBIを自分の手元において仲間に作業中のPBIを表示する

+ コミュニケーションを行うタイミングと作業するタイミングにメリハリを付ける

+ 質問時に現在作っているプログラムは動くようにしておいて動いている状態で進捗を報告する


2日目はじめに作業を全部捨てたBチームは2人ごとの2チームを内部で作り、ペアプログラミングをする形に変更し、スプリントの開始と終わりに必ずミーティングを行うこと、PBIの整理をその際に作り、不足分を協議して実装する場合に必要かの優先度をつけて作業をし始めました。

最初に教えたことを忠実に実践し始めました。

(ペアプログラミングは教えていませんでしたが、前日帰宅後に調べてきたようです)


3,4日目は時間ギリギリの中で全員が必死になって実装を行っていましたが、最終的に3チームとも実装はできていなかったです。


作業全体を終えて。


Aチーム

作成したプログラムは動作しているものの実装は途中までしかできていませんでした。明らかにメインと他2名で業務の差が大きく、メインのメンバーが間違えて実装していたことを指摘して戻るまでに半日(1スプリント)無駄にしたという報告をもらいました。

レトロスペクティブの時間も実装の話をしていたり、交流がしっかりできていなかったりというのが見受けられました。

チームで業務を行う上で今回の問題の解決策としてどうしたらよいか、ということを最後に話し合ってもらいました。


Bチーム

1日目を捨てたチームでしたが、実装がかなり進んでおり、2日目に出された追加要件以外は実装が終わっていました。一部処理の難しい帳票は省略した帳票で実装されており、もっともステークホルダの要望に答えられたチームとなりました。

成功の要因として、使い方のわからないコマンドはペア二人で別々で使い方を模索、そして本番コードは一緒に実装する。そこでわかったことはスプリントレトロスペクティブのミーティングでお互い情報を交換する。

このチームは30分とスプリント時間に比べて非常に長いレトロスペクティブの時間を実装時にどうするべきか、作業に詰まったところ、4人で並列に行う作業と、一緒に行う作業のタイプの分類などをしっかりと時間いっぱいに活用していました。


Cチーム

最後までバラバラでした。4日目になっても一人は実装していたけどほかのメンバーはそれを眺めているだけで手を動かす雰囲気もなく終わりました。

メンバーの中で自発的にどのように行動をするかなどの仕切るタイプもおらず、各自で分担して作業することもなく、研修を終えていました。

他のチームから比べて遅れてしまった最大の要因は誰かに任せてしまったことというのを口を揃えて発言していました。

今後の業務を行う上で、各自が自律して業務を行うためにどのようにしたらよいかを最後に話し合ってもらいました。



## 研修を通して学んだこと。


自分自身もスクラムで業務を行う前でしたが、今回一番学んだことは、Aチームのトップメンバーは11人の中では技術力は非常に高く技術的な感もあったためここがダントツで全部こなしていくことより、結果的にはメンバー4人がスクラムの規律の中で、自律して業務を行い、効率的に作業したBチームが最も実装を行えた結果を見れたことです。


初めて何かを作るという不確定性の高いことに、手探りで挑戦していく上でスクラムの規律に乗っ取り勧めていくことで、効率的に困難に立ち向かえることも学びました。


新入社員だけでなく、僕自身も学べましたので。

みなさまにも、研修の一環としてこのようなミニゲームを実践していくのをおすすめします。


> Written with [StackEdit](https://stackedit.io/).

2021年1月10日日曜日

アジャイル開発歴

こちらは僕のアジャイル開発に関する略歴です。


大学在学時に、学生ベンチャーに所属した際に、インフラ中心の開発技術者として業務を行っていました。


メンバーはサーバ及び、アプリの開発をJavaにて行っており、開発はXP開発を基本として行っていました。


アジャイルマニフェストや、基本的なアジャイル開発をその頃に書籍及び、実践にて学びました。


とはいえインフラエンジニアなので、要件の整理や開発管理などで開発自体は行っていませんでした。


最初のベンチャーからネット広告会社に転職しました。

その際に、WEBサービス開発として入ったのですが、結果的に、前職の経験からインフラエンジニアに転向しました(サービス企画開発や、新規サービスのPoCは行っていましたので、小規模な開発業務を行っていましたが。)


会社の規模の割に、インフラ担当は僕だけなので、

効率的な構築と、サービス停止が起こらないような安定的な作業などが必要で、サーバの規格化、サーバの構築

の自動化、複雑な遠隔監視のための整備、リモートデスクトップやDRACなどのリモートコンソールの整備などを行いました。


トラブルの発生の際や新しい方式の追加ごとに監視や設定や運用を見直し、各種インフラの設定ファイルの管理を集中化し、サーバ構築時のOSインストールの自動化のためのシェル整備、特殊な監視のためのプログラムの追加なども行っていたので、インフラ業務でありましたが、開発作業も結構行っていました。


多分今風の言葉で言うところのSREの業務だったと思います。


AWSのサービスが始まったか始まっていないかの頃で、これらの業務を行っていたため、クラウドサービスが充実した今となっては、この頃の作業の大部分はクラウドサービスを利用することで、簡易化されるようになりました。


そこから転職して、インフラエンジニアを卒業してWEBアプリケーションエンジニアになりました。


少人数で開発する、社内外サービスの要件から開発まででアジャイル開発案件を担当しています。


現在はXP開発だけでなく、スクラムでの開発も行っています。


デベロッパーやプロダクトオーナー、スクラムマスターなど案件により立場は変わっています。


> Written with [StackEdit](https://stackedit.io/).

2015年2月20日金曜日

raspbianでのswapファイルサイズの変更

/etc/dphys-swapfileの中の
以下のパラメータを変更する。
※MB単位です。


CONF_SWAPSIZE=100

.vimをdotfilesで管理している時のneobundleのインストールshell

dotfilesディレクトリを作成して.bashrcや.rubocop.ymlや.vimを管理している人がいると思いますが。
.vim以下にgitリポジトリを別で持つと面倒なので(submoduleでできると思うけど)、.vim/bundle/以下をあとからshellでインストールするようにします。

想定している構造はこんな感じ。

/dotfiles/.git/
/dotfiles/.gitignore
/dotfiles/vim/
/dotfiles/bashrc
                :

まずは.gitignoreに/vim/bundle以下を管理しないように記述。

/vim/bundle


以下のシェルファイルをdotfiles以下に記述


=====install_neobundle.sh======
#!/bin/sh

PWD=$(dirname $(readlink -f $0))

if ! [ -d ${PWD}/vim/bundle ]
then

  mkdir ${PWD}/vim/bundle/
  cd ${PWD}/vim/bundle
  git clone https://github.com/Shougo/neobundle.vim

fi

exit 0
===========

新環境で利用する際には、展開後にshellを実行して。

vimで:NeoBundleInstallを実行する。

2015年2月8日日曜日

ActiveRecord Enumとselect boxの連携でrails_configを使う

環境は以下になります。
ruby: 2.2.0
rails: 4.2

config(旧rails config)をインストールします。
(settinglsogicでも利用できる方法だと思います)
Gemfileに以下の記述を追記します。

gem 'config'

gemをインストールします。

$ bundle install

rails_configをrailsにインストールします。

$ bundle exec rails g config:install

今回はtestdata(モデル)にstatus(カラム)を設定してenumを利用します。
scaffoldを作成します。

$ bundle exec rails g scaffold testdata status:integer

statusで利用するリストをconfig/settings.ymlに記述します。

model:
  testdata:
    status:
      admin: 10
      normal: 20
      guest: 30

記述に対してデータを設定します。
app/model/testdatum.rbに記述します。

class Testdatum < ActiveRecord::Base
  enum status: Settings.model.testdata.status
end

設定したデータをviewフォームに適応します。
app/view/testdata/_form.html.erbでの該当のフォームを以下の記述に変更します。
selectedも同時に設定します。



  <%= f.label :status %>
  <%= f.select :status, @testdatum.statuses.keys , selected: @testdatum.status %>



2014年8月13日水曜日

yum group

メモ

yum grouplist

->

yum groupinstall

2013年12月13日金曜日

rails3でのdependentでrestrictを設定した場合の対処法

モデルでのdependentをrestrict にした場合の

消去出来なかった場合のエラー対処方法

 

Model

class ShareType < ActiveRecord::Base
  has_many :shares, :dependent => :restrict
end

Controller

class ShareTypesController < ApplicationController
  def destroy
    begin
      @share_type.destroy
      flash[:success] = "successfully destroyed." 
    rescue ActiveRecord::DeleteRestrictionError => e
      @share_type.errors.add(:base, e)
      flash[:error] = "#{e}"
    ensure
      redirect_to share_types_url
    end
  end
end 
 
 
元ネタはこちらから
http://apidock.com/rails/ActiveRecord/DeleteRestrictionError 

centosでmrtgの表示をnginxに変更する

mrtgの接続をapacheのデフォルトで設定されているのと同じように、
http://localhost/mrtg
にて接続出来るように設定を追加する。

nginxのdefaultサーバの設定ファイル(/etc/nginx/conf.d/default.conf)に以下の設定を追加する。

    location /mrtg {
         allow 127.0.0.1/32;
         deny all;
         alias /var/www/mrtg/;
    }

allowを追記する事で接続出来るサーバを追加できる。

2012年11月22日木曜日

NKFでのWindows文書変換

NKFでWindowsでのShift-JISをUTF-8に変換する場合は
WindowsのShift-jisが不正規なためCP932として指定して実行する

nkf -ic=CP932 -oc=UTF-8

みたいな感じかな。

2012年1月26日木曜日

CentOS6で日本語入力

remoteXなどでログインして

日本語入力をするための方法。

~/.bashrcとか/etc/bashrcに以下のような設定を追加する。

export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus

入力の設定を行うときはibus-setupで設定変更画面を表示する。

2011年11月22日火曜日

prefixからnetmaskにshellで変換する方法 その2

http://inpwjp.blogspot.com/2011/05/plefixnetmaskshell.html

ここで紹介したプレフィックスからネットマスクを作る方法よりもさらにスマートな方法見つけたので記載。

prefix=${prefix_num}
export $(/bin/ipcalc -m 0.0.0.0/${prefix} );echo $NETMASK


これだけです。
すごいすっきりした。

2011年8月26日金曜日

iSCSIの特性

iSCSIは遅いというイメージがありがち
D社のEをいろいろ試験したことがあって、
やはり最高速度はギガビットイーサの限界で頭打ちになる。
これはmultipathを使っても同じ結果なのだが、
本領はここではなく、複数からの同時アクセス時の速度低下率が圧倒的に低い。
Eのクラスタを増強すればするほど低下率が低くなる傾向にあるように見受けられた。
仮想化システムのストレージ環境としては理想的な動作形態だと思われる。
NASとは違って書き込みの排他ロックはかからないので、
パーテションで分割しての話だが、
サーバ側で複数のネットワークポートを持ってmultipathを行った場合も
複数のファイルの同時参照で速度の低下率は軽減される。
(1つのセッションでは1本分しか使わないが複数の通信になると空いているポートで通信するような挙動になっている。複数のポートで1つの通信を分割して高速化するような動作はしない。)


我が家のterastation iscsiでは複数のパーテションに分けるのも面倒なのでテストはしていない。
terastationの場合はポートトランク(Linuxのボンディングモード0だと思われる)を使ってるので
経路上の通信速度は2本分までマルチバンドしていると思われるが、ディスクの速度が遅いので
恩恵は受けられない。

2011年7月19日火曜日

Atom 330用のCPU周波数自動変更用のshell

CentでAtom330使ってるけど、CPU周波数の自動変更がどうも上手くいかないので
(p4-clockmodを使っても )

設定を変更できるような簡易的なshellを作成

======
#!/bin/sh -x

middle="800"

under_freq="199"

top_freq="1599"

current_freq=$(/usr/bin/cpufreq-info -f)
current_loadavg=$(cat /proc/loadavg | awk '{print $1}' )

if [ $(/bin/echo "${current_loadavg} > 1.2" | /usr/bin/bc ) = 1 ]
then
  if [ $current_freq -lt $[$middle * 1000 ] ]
  then
     /usr/bin/cpufreq-set -c 0 -f ${top_freq}MHz
     /usr/bin/cpufreq-set -c 1 -f ${top_freq}MHz
  fi
elif [ $current_freq -gt $[$middle * 1000 ] ]
then
  /usr/bin/cpufreq-set -c 0 -f ${under_freq}MHz
  /usr/bin/cpufreq-set -c 1 -f ${under_freq}MHz
fi

exit 0
======

いい加減に作ったんで保証は無いです。
とりあえずcrontabで定期実行しております。

追記。
crontabだとなんだかあれなのでdaemonのシェルでラップしてみました。

#!/bin/sh

while :
do
  /root/change-cpufreq.sh
  sleep 5
done

こんな感じで。

そして
# nohup XXXXX.sh &
で実行させてる。
必須のシステムじゃないし作りこみはしない方向で。

Android+DLNA

スマートパッドとDLNAの親和性すごい。

我が家の環境では
Linux+mediatombのDLNAサーバに
HoneyComb+UPnPlay+VPlayer

DivXもMP4もこれで見てる。

2011年7月15日金曜日

bashでAのファイルからBのファイルにあるラインを消去

タイトルのとおり。ファイル同士を比較してラインを消去する。
消去対象のラインの位置に依存しない。

cat ${filenameA} | while read line ; do if ! $(grep "\^${line}\$" ${filenameB} > /dev/null ) ; then echo ${line} ; fi ; done

2011年6月22日水曜日

bashで入れ子の入れ子

ちょっとホストデータの取得方式を
いろいろ考えてたんだけど

data=$( host_data=($(dig ${fqdn} a |grep -v ";" | grep -v CNAME | grep A)) ; echo ${host_data[4]} )

こんな感じの変数を入れ子の中で持たせることもできるのね。

2011年5月24日火曜日

while read を使うshell

特定のファイルから情報を取り込んで一定の情報を吐き出す場合に
変数として$1,$2をとるという形式があると思う
より進化したやり方としてはgetoptを使って引数をより詳細に設定する方法

しかし単純なデータの編集などの場合は
while read line
do
 echo $line
done
みたいなwhile readを使って標準出力に表示する方法がいい
shellの想定した使い方として

cat file1 | sh shellex.sh > file2

このようなshellで一般的なパイプとリダイレクトを利用した
データの受け渡しが出来る。
単純なデータの受け渡しだけでなく

cat file1 |sed s/aa/AA/ | awk -F; '{print $3}' | sh shellex.sh | grep -v "^#" > file2

みたいな一般的な編集コマンドの間に挟んで利用することも出来る
作ったときは単体かもしれないけど
将来的にはいろんな形式の間に入れることが出来て非常に便利になる。

2011年5月18日水曜日

plefixからnetmaskに変換するshell

 plefixからnetmaskを変換するbashスクリプト
難しいことは考えずにリストを作成して参照する形にした。

netmask0="0.0.0.0"
netmask1="128.0.0.0"
netmask2="192.0.0.0"
netmask3="224.0.0.0"
netmask4="240.0.0.0"
netmask5="248.0.0.0"
netmask6="252.0.0.0"
netmask7="254.0.0.0"
netmask8="255.0.0.0"
netmask9="255.128.0.0"
netmask10="255.192.0.0"
netmask11="255.224.0.0"
netmask12="255.240.0.0"
netmask13="255.248.0.0"
netmask14="255.252.0.0"
netmask15="255.254.0.0"
netmask16="255.255.0.0"
netmask17="255.255.128.0"
netmask18="255.255.192.0"
netmask19="255.255.224.0"
netmask20="255.255.240.0"
netmask21="255.255.248.0"
netmask22="255.255.252.0"
netmask23="255.255.254.0"
netmask24="255.255.255.0"
netmask25="255.255.255.128"
netmask26="255.255.255.192"
netmask27="255.255.255.224"
netmask28="255.255.255.240"
netmask29="255.255.255.248"
netmask30="255.255.255.252"
netmask31="255.255.255.254"
netmask32="255.255.255.255"

prefix=${plefix_num}
netmask=$(eval "echo \${netmask${plefix}}")

ちなみにplefixをIPから分割するには
echo ${ip} | sed s#.*/##
みたいにすると出来る。

2011年3月8日火曜日

kindleでpdf

久々に投稿

kindleでpdf使うのが結構不安定だったのですが、
最近のファームにしてみると安定して見れることを確認。

ありがとうamazon

というわけで最近はkindleでpdfを閲覧中。