ガチプログラマーがリファクタリンしたときに感じたWordpressでコーディングする際の注意点

最近、既存のWordpressを修正する機会がありました。デザインは崩れているし、ソースコードを触るのは辛い状態だったので、大幅にリライトしてリファクタリングしました。テーマを既存のテーマAffingerに切り替えて、機能を実装するために本当に必要な最小限のソースコードに書き換えた結果、メンテナンス対象のソースコード量は一桁どころから二桁ぐらい減らせた印象です。

いままでちゃんと技術的な品質の管理や指導をしていなかったと反省です。

せっかくいろいろいじったので、ガチプログラマーがリファクタリンしたときに感じた、Wordpressでコーディングする際の注意点をまとめてみました。

既存のテーマをベースにするなら既存のテーマの思想や機能を活かして必要最低限の実装をする。

フルスクラッチでWebサイトを制作する時のように、理想ベースでワイヤーフレーム、カンプを作って、開発・制作に入るならば、Wordpressのテンプレート階層などをしっかり理解して、必要十分にフルスクラッチでテーマを独自実装したほうがいいと思っています。

しかしながら本当に自分たちが作りたいWebサイトにそこまでのオリジナリティーが必要かどうかは立ち止まって考えたほうがいいです。既存のテーマを活かせば、多少独自機能をいれても数日でも終わってそこそこの見栄えになります。しかしながらフルスクラッチで書けば、しっかりやらないとデザインは残念になりますし、工数も数倍以上に膨れ上がる可能性があります。

また逆に、Stingerなどの既存のテーマを利用しているのに、既存のテーマの思想や機能を活かさずに開発や制作すると、思ったように動かすのに逆に既存のテーマの実装が足かせになって大変になります。既存のテーマを使うならば、既存のテーマの思想や機能を熟知して、どこまでカスタマイズできるかをしっかり把握すること。そのうえでそれを活かした自分たちのサイトの設計をすることが大事です。

子テーマを使う

これはやってあたりまえの話です。カスタム投稿タイプやタクソノミーなどを活用して独自機能を実装する場合は、どうしてもテーマのテンプレートファイル等のPHPファイルのカスタマイズが必要になります。

ここで絶対やってはいけないのが親テーマそのものの修正です。既存テーマは多機能なので当然コード量も多い。そこを直接様々な個所をいじるとメンテナンス対象のコード量が爆増します。また、既存テーマがアップデートされた際に、それを取り込むのが難しくなります。

子テーマを使えば、独自実装部分が明確にわかるし、また独自実装の範囲が狭くなるので、把握しなくてはいけないメンテナンス対象のコード量が劇的に減ります。

ExePHPは使わずにショートコードを使う。

これも常識の範囲の話で、とにかく ExePHPは絶対に使用しちゃダメ。プログラムを記載する部分は、ショートコードなどを使いCMSから書くコンテンツから必ず切り離して、プログラム部分はGitで管理できるようにしましょう。

テンププレートにロジックを記載しない

テンプレートには、可能な限り条件分岐などのロジックを記載しないのがベストです。例えば、新着フラグを表示したいようなケースで、下記のような記述をテンプレートに直接書くのはやめましょう。

template.php

<?php
    if (date('U', (date_i18n('U') - get_the_time('U'))) < 24 * 3600 ){
       echo '<span class="newlavel">New</span>';
    }
?>
<h2><?php the_title();?></h2>

こういった場合は、独自テンプレートタグを実装して、テンプレートは <?php the_xxx(); ?> のようなテンプレートタグを呼び出すコードを記載する。そして、functions.phpなどに独自テンプレートタグ関数を用意して、テンプレートからロジックを分離しましょう。

template.php

<?php the_new(24);?><h2><?php the_title();?></h2>

functions.php

function the_new($hour) {
    if (date('U', (date_i18n('U') - get_the_time('U'))) < 24 * 3600 ){
       echo '<span class="newlavel">New</span>';
    }
}

ショートコードの実装関数や独自テンプレートタグ関数にロジックとHTMLが混在させない

さっきの例は下記のようにするとむちゃくちゃメンテナンス性があがります。

functions.php

function the_new($hour) {
    if (date('U', (date_i18n('U') - get_the_time('U'))) < $hour * 3600 ){
       get_template_part('partials/new-labe.php');
    }
}

partials/new-label.php

<span class="newlavel">New</span>

ショートコードでも関数内にHTMLを直書きしないでget_template_partで外だししましょう。

空の固定ページ&テンプレートでHTML実装をやめる

例えばslugがhogeな空記事の固定ページを作成して、固定ページ用テンプレートpage-hoge.phpを用意して、すべてHTMLに直書きをするのは避けたいです。

絶対にダメなわけではありませんが、運用中に文章の変更などが、簡単にできなくなります。

こういう場合は、固定ページの記事に、エディターを使って静的な記述を行うこと。どうしても必要な動的な記述はショートコードに分離したほうがいいです。

ICCプレイベント「最高の成果を生み出すリーダーシップとチームマネジメントとは何か?」からの学び

今日はICCのプレイベントに参加してきました。IVS/ICCはもう五年ぶりくらいでしたが、小林さんのポストを日々見てる中での参加だっだので、とても面白かったです。

パネルディスカッションのテーマは、「最高の成果を生み出すリーダーシップとチームマネジメントとは何か?」ということでした。

最初の問いかけリーダの仕事の定義については、山田流では、「チームを作り、メンバーを集め、自走させて、結果を出す」です。

ここからは、パネルディスカッションを聞いてのメモなどです。

会社もコミュニティの1つ

コミュニティマーケティングの理論では、活性化していくコミュニティは高い継続率とあわせて一定量の新規参加率が必要だということでした。つまり会社には常に新規率が必要で、フィロソフィーにあわないメンバーの卒業と、さまざまなタレント性を持つ新規メンバーの加入が必要なのでしょう。

内村鑑三とジャックマー

リーダーが残すべきものは、金、事業、哲学・思想。もし、哲学・思想まで至らなくても、生き様を発信する、残していく。

そして生き様を発信して、愛される人になる、自分が愛するモノやチームを愛してもらえる人になる、そして相手が自分と話すと相手が本人自身を愛するようになる。

スポーツと仕事

よく仕事には、試合と練習がないから、スポーツのようにはうまくいかないとという人もいるが、あえて仕事も、勝負所(試合)と練習は自分で定義づけして、やればいい。

コーチの要件定義

プロフェッショナル、インターパーソナル、イントラパーソナル、ビジョンとフィロソフィー

思想とは

思想とはビヘイビア・スタンダートのこと。また優先順位をつけること。量か質か。即断か熟慮か。

ディシジョンメーキング

調子いい時ほど、交代の判断が鈍る。危機なほど、勇気を持って判断できる。

ディシジョンメークのトレーニングは、平常、緊急時用の2つが必要。

第1期解散と第2期スタート!

五月末に、チームメンバと話して、「いったん今のLiberappのチームは解散する、全てを白紙に戻しゼロベースで新しいLiberappを考え直す」と伝えました。

そのあと二週間は開発を中断して、チームメンバーと、ミッション・ビジョンについて、どのように実現すべきか、価値観や行動基準を元に自走していくことについて、考えてもらい話しあいました。

その結果としては、チームはいったん解散する。最初のゼロイチは、自分がフルコミットすることにしました。

背景

私は、ビジョンを掲げ、戦略(マイルストーンの決定とリソースの調達)の立案と実行が重要な仕事だと定義していました。また、現場のメンバーは、バイアブルでセクシーなプロダクトを作ることがこの半年のマイルストーンでした。

現時点では、僕は役員報酬ゼロですが、メンバーはスタートアップとしては高待遇で、半年で全資本金を使い切るバーンレートでした。そのため、六月末が重要なタイミングでした。しかし、私の直感では、六月末(多少遅れたとしても)に、資金調達ができるセクシーMVPプロダクトができる気がしないと感じていました。

最低でもセクシーなプロダクトがないと、シード期の資金調達は不可能。基本はモノがないと無理だと考えています。もちろん、シリアルな起業なので、プロダクトがなくても、個人の信頼である程度のお金を集められる、自分でも投資できます。

しかしながら、過去の経験から、何がが壊れていてイメージ通りに動かさなすぎる時、特にアウトカム(数値)ではなくて、アウトプット(成果物)やチームに問題がある時には、勇気を持っていったん撤退してから、再度進む方がいいと思っています。

お金の力はレバレッジの力なので、うまくいかない時に、お金を集めると、「うまくいかない」ことにレバレッジがかかり、メチャクチャな結果が待っています。

そのために、まずはいったん解散とゼロベースで考える宣言をして、メンバーととことん話し合いました。その結果、最終的に第1期は終了としました。

これから

チームメンバーと一緒に半年働けたことは大変感謝しています。ミッション・ビジョンには共感してくれていたことは確かです。価値観や行動規範の変化には、すぐに適応できていなかったものの、時間の問題であり、スタートアップではなく、数年待てるような環境であれば、適応できたいたはずです。

また数年後に環境が変われば、再結成しようと話して、Liberapp第1期のチームは解散して、第2期に移ります。

今日はLiberapp最後の懇親会兼送別会でした!

過去の振り返り

このような問題起きた表面的な理由は、 昨年末まで約20年弱経営してきて、中小企業状態とはいえ事業が成り立っていたスパイシーソフトから、完全なスタートアップであるLiberappに、メンバーをあっさり連れていったことです、

スパイシーソフト前期では自分が経営者として未熟であるがゆえにアグレッシブにデマンドフルでした。逆に後期は反動で、自分の仕事のやり方や、価値観に妥協が多かったと反省しています。

Liberappでは、スパイシーソフトとは全く異なり、自分のミッションビジョンを明確に、そこに向けて価値観や行動基準を軸に自走するチームにしたいと経営してきました。

しかしながら、中小企業からスタートアップへの環境変化、経営者のマインドの大きな変化に対して、ちゃんとメンバーがついてこれるように、ナビゲーションしてこれたとは言えません。もちろん、メンバーもついてくる馬力や、スタートアップとしての覚悟が十分であったとは言えないと思います。

役割分担がぶれていた

ます、チームメンバー全員が、ミッション・ビジョンを達成する当事者であるという、根本的な役割分担があります。

その上で、CEOは「どこへ行くか誰をバスに乗せるか」を意思決定する役割。CxOは「どうやってそこへ行くか」を意思決定する役割だと考えています。

まず、このフェーズにいるメンバーに、しっかりCxO的な役割を与えなかったこと。

それもあるし、今までの手癖で、メンバーが「どのように」が自分達の役割でないと思っていた、もしくは「どのようにしたら」を考える癖がない、考えて行動する技術がない状況でした。

価値観がぶれていた

社長は価値観「どういう仕事での行動が嫌なのか」をはっきり掲げて、そこを妥協しないことが大事なのですが、チームの中ではそこへの反感は持たれていませんでしたし、傍観者的な共感はありました。しかしながら主体者として行動がありませんでした。

私が大事にしていたことは、「やらない後悔よりやって改善・見逃し三振はナシ空振り三振はオッケー」、「ミッションビジョンの達成のためであれば、価値観や行動基準をもとに、どんどん自走する」「おかしいことはすぐに声を上げる」の3つです。

ここの不一致は私自身がストレスフルでありましたが、それ以上にチーム間のコミュニケーションがうまくいかずに、プロダクトの品質や生産性の故障につながっていました。

今後に向けて

この半年で、開発や渉外を通じて、ミッションとビジョンは、クリアになりました。さらに、二十年間経営してきて、一度封印していた自分が大事にしている価値観が、昔と違ってスマートに蘇ってきました。

今回の学びで、よりマネージメントとしてさらに大事にしたいことは、2つです。

⑴ 社長は、チームメンバーに、ミッション・ビジョン・価値観・行動規範からの大きな問いかけを根気よく続ける。

話がぶれないように、マイクロな話にならないように、喋りたい気持ちを我慢する。メンバーが考える癖をつけるように、何度でも根気よく問いかけ続ける。

⑵ どんな小さな違和感でも速やかに、すぐにタンタンとフィードバックして、根気よく問いかけ続ける。

よろしくお願いします。

ブレない基準、MVPの定義、失敗は速やかに認める、故障は放置しない

一流の基準で成否の基準を持つ。

自分の今のスキルを基準にしない。結果が悪い時に基準をブラさない。基準とは速度計のようなもので、世の中の基準を目安にする。

生産性や品質の基準は全て、市場の勝ち組ができていることが基準になる。言い換えるとお客さまが支持するかしないかが基準。

今基準を達成できていなくても、過去達成できてなくても、基準はぶらさずに、達成できていないということを明確にすることが大事。

いまのスキルで基準の難しいと思うなら、達成するための分野や手順を10に分解してみる。そうすると大半は出来ることなので、すぐにやり始める。分解してもまだ難しい箇所は、さらに10に分解して取り組む。

成果物の価値から一日でできないといけない場合や、一日でできると見込んでいた場合に、想定外のことや、はまってしまったことで、一週間かかってしまった後に、「そういうもん」だと基準(ゴールポスト)を動かさない。基準とは、失敗したか成功したかを、見極めるためのもの。勇気を持ち失敗を受け入れることがまず大事。失敗を認められる人間だけが成長できる。

そして、想定外だったことをどう想定内として効率よく処理できるか、ハマってしまっことは、次はどうしたらはまらないか、考えること。もし難しかったら、10分割なりをしっかりして、一つづつ取り組む。

MVPの定義

・MVPとは、一つの仮説を検証するための、もっとも小さな、もっともセクシーな成果物を作ること。仮説のないアイデアでいろいろ粗雑にたくさん作ることではない。

失敗するのは勇気のあるカッコいいこと

・失敗は早ければ早いほどいい。だから、小さいサイクルでプロダクトは、顧客に短いサイクルで価値を提供して、仮説を検証したい。

さらにリリースのサイクルよりももっと小さく、失敗は早めにした方がいい。間違っている・壊れているものを放置すると、疲弊する。失敗とは、「間違っていると分かったら間違っていると認めること」「基準に達成していないことを認めること」。つまり、失敗するのは勇気がいるかっこいいこと。自分たちの過ちを速やかに認められることだから。

疲弊が故障の原因ではなく、故障の放置が疲弊の原因。

故障だと分かっているものを放置し続けると心が病む。ゴミが散乱している部屋での生活を想像してみよう。

疲弊してるから故障を直せないのではない。故障をほうちするから疲弊する。もちろん疲弊すればさらに故障は放置される。

常に故障は放置しない。気合いを入れてクリーンな状態を保つことが、心の健全さを保ちやる気を養う。

短いイテレーションでの試行錯誤の仕方

試行錯誤とは仮説検証のこと

試行錯誤するとは、思いつきのアイデアを試してダメなら、他のアイデアに飛びつくことではない。仮説を持ち検証することを試行錯誤という。

プロダクトの仮説は三階層で考える

仮説は三階層で考え検証する。

⑴ 解決すべきペイン・満たすべきニーズは誰の何か?

⑵ ペインを解決・ニーズを満たす必要条件な機能は何か?

⑶ 機能をユーザに使ってもらうためにはどのようなセクシーさが必要か?

KPIは検証手段

仮説検証のためにKPIが必要。KPIを目標にしてブレストで雑にアイデアを考えるのは最悪。三階層で仮説を考えて、KPIから検証して、仮説の故障を探して、修正することが大事。

KPIを目先の目標にして、ただ思いつきのアイデアで、いろいろやるのが一番最悪のやり方。

検証の仕方

仮説にもとづきリリースしたもののKPIがイマイチだった場合になにが故障しているのか振り返る必要がある。

⑶が故障していると⑵は検証できないし、⑵が故障していると⑴は検証できない。

もしくはプロダクトそのものではなくて、リリース方法が故障している場合もあるので、KPIの数値の意味(分解)を考える必要がある。

ソーシャルグラフを超えたコンテンツのシェアが強みです

前回コンテンツ戦略 からの続き

二ヶ月前にプロジェクトのやり方を見直しました。とくにここ最近は何があっても毎週リリースするという方針でやってます。

FPSをあげる!

毎週リリースで年50打席、早く失敗して軌道修正を繰り返す。これから立ち上が市場で大きなゴールを目指しますので、戦略や仮説のエラーを早い段階で修正する必要があります。開発の初期段階からKPIの数値をみながら仮説検証をくりかえします。 https://corp.liberapp.net/?page_id=1569

そのおかげで、プラットホームも、HTML5コンテンツも、刺さりそうなポイントが見えてきました。

なので試行錯誤を繰り返すところから一歩先に進み、本格的にコンテンツ調達に力を入れていくフェーズになったと感じています。

もちろんHTML5ならではの新しい遊びを提案できらコンテンツを提供します。僕らが力を入れるジャンルは大きく二つです。、

一つ目は、ある特定のソーシャルグラフに依存しない、ソーシャルグラフをまたがった人間関係「知り合い」を軸にしたアプリです。

さらに掘り下げると4種類想定しています。

  • (1) 知りあい同士がリアルをメインに一緒に遊ぶ。
  • (2) 知りあい同士がリアルでもネットでも一緒に遊ぶ
  • (3) 知り合いがリアルであうきっかけを作る
  • (4) 知り合い同士がコミュニケーションをするきっかけを作る

二つ目は、様々なプラットフォームにいるインフルエンサーソーシャルグラフをまたいでファンとエンゲージメントするアプリです。

あとは、具体的にどう準備していくか考えていかなくてはいけないですね。

親テーマでカスタマイズした内容を子テーマに反映

コーポレートサイトにてWordpressのOPENPRESSテーマで構築することに。

後からコードレベルのカスタマイズが必要なことに気づく。

子テーマを後から導入したのでこれまでの親テーマでのカスタマイズを子テーマに反映させる。

UPDATE wp_options AS td,(SELECT option_value FROM wp_options WHERE option_name="theme_mods_onepress") AS ts SET td.option_value = ts.option_value WHERE td.option_name="theme_mods_onepress-child";