ha-ah

로그, 게으른 로그

Agile, Culture, Human - Be the Change!

2019.10.18 COEX Grand Ballroom에서 진행됐던 Agile Korea Conference 2019를 다녀온 후기 입니다.

Prologue

Scene #1

나름 사장님/CTO의 지원도 잘 받는 것 같고 사내 스크럼 마스터가 여럿 있으며, 스프린트로 프로젝트가 진행되고 개발 문화도 썩 괜찮아 보이는 회사에 다니는 형님이 애자일은 제대로 동작할 수 없다는 말씀을 하셨다. 일상의 스프린트부터 인사평가까지 많은 문제를 발견하신 것 같았다.

이런 문제를 다룬 글도 매년 잊을 만 하면 나타나 소셜 네트웍을 달군다. “애자일은 말도 안돼. 스프린트는 죽었다”. 그런데 내 짧은 지식으로는 그런 글이 애자일을 다루지 않는다고 생각했다. 애자일이 하나의 스타일이라면, 스프린트는 구현체이자 프레임웍이다. 애자일하게 일하기 위해 일관된 업무 프로세스를 만들고 모두가 쉽게(과연 쉬울지는 모르겠다) 따를 수 있는 행동 지침을 명시한 것. 그런데 그게 그 팀/회사에 맞지 않을 수도 있고, 그렇다면 바꿔야 하지 않는 건가…라는 것이 나의 의문이었다.

애자일이 무엇인지는 그 형님네 스크럼 마스터들이 더 잘 알 것인데, 왜 개선하지 않는 것일까 엄청 궁금했다. 혹은 진행 중인가? 언젠가 형님께 부탁해서 술자리라도 마련해보고 싶다.

Scene #2

100명 이상의 카카오톡 단체채팅방 끔찍히도 싫어하는데(앱 아이콘에 숫자를 꼭 없애야 직성이 풀리는 성격이라), 애자일 컨퍼런스 코리아의 단톡방은 꽤나 조용해서 그나마 유지하고 있다. 그런데 컨퍼런스를 앞두고 취소나 출석 인증에 관한 문의가 끊임없이 올라왔고 - 여기까진 그럴 수 있다. 딱히 이야기할 곳이 있어보이진 않았으니까 - 급기야 운영진 전화번호를 공개했으나 진상부린 사람들이 꽤나 있었나보다. 행사 진행에 있어 취소 등 행정 업무 지원이 좀 미비했던 것은 사실이나, 개인 시간 쪼개 진행하는 사람들을 욕하고 비난하는 사람도 많은 게 사실이다. 어느 컨퍼런스든.

그랬구나 하며 운영진에게 동정심을 가지던 찰나, 어떤 사람이 “애자일하지 않군요”하면서 방을 나가버렸다. 하루 전 취소가 안되어 돈을 날린 것이 애자일하지 않다니.

여럿 당황한 공기가 감돌았고, 어떤 분은 친절하시게도 애자일한 것이 무엇인가를 대신 말씀해주셨지만, 많은 사람들은 이미 그 의미가 무슨 뜻인지 알았을 것이다.

이를테면 ‘애자일 한다고 하는 사람들은 완벽해야한다’. 음? 어디서 많이 들어봤는데… ‘좌파 놈들 지들은 깨끗한 척 하더니…’ 이런 거?

그러니까 나는 애자일이란 것은 ‘나를 가르치려 드는 잘난 척 하는 사람들의 요식 행위’같은 것 쯤으로 받아들여지고 있다고 해석한다.

가만. 이 또한 어디서 많이 본 장면.

“TDD는 현실적이지 않다”

TDD를 자신이 얕게 경험한 만큼만 이해한 사람들 혹은 어떤 유튜브에서 유명한 사람이 이야기한 것만 받아들이면 정말 현실적이지 않은 것만 같다. 난 ‘현실적이지 않다’는 의미는 어쩌면 현실에 맞추지 않았기 때문이라고 생각한다.

Agile Korea Conference 2019

Lean Coffee

2017년인지 컨퍼런스에서 린커피란 것을 처음 목격했을 때, 도대체 왜 저러는 건지 이해하지 못해서 참여할 생각이 없었더랬다. 올해부터는 거의 매월 애자일 밋업에 나가보니 그 이상한 사람들(매사에 이렇게 적극적인 사람들은 교회 이외에는 경험해보지 못했었다. 예비군과 지구 반대편에 살 것 같은 사람들임)에 슬슬 적응이 되기 시작했고, 린커피도 참여해보고 싶었다. 실제로 어떤 분은 ‘커피를 준다’고 알고 오신 분도 있었는데, 컨퍼런스에서 카누를 제공하긴 하나 린커피와는 크게 관련이 없어 보인다. 린커피에 대해 궁금하신 분은 여기같은 글을 좀 더 읽어보시면 되겠다.

전날 매우 힘들 일이 있어서 린커피를 약 20분 남겨놓고 도착했는데, 그래도 분위기나 볼 겸 슬쩍 옆에서 진행중인 테이블에 꼈다. 애자일을 많이 경험해보고 고민해본 사람들이 주를 이루는 월간 밋업과 다르게 컨퍼런스는 애자일을 도입했으나 잘 안되니 고통스러워 하는 사람들이 오지게 많이 오는 것 같다. Modern PHP 모임에 가도, 처음 오신 분들은 레거시 PHP에 고통받는 이야기만 하고 가시는 경우가 허다하다. 이처럼 컨퍼런스에서의 린커피는 애자일 도입 초기의 고민이 주를 이룰 수 밖에 없는 흐름이 되어 가는 것 같았다.

이야기 자체는 크게 유익하지 않았지만, 다음에는 처음부터 재미있게 이야기 할 수 있으리란 확신이 들었다.

Keynote : Play Agile like an Adult: a story of mistakes from Formula1 to bank

영어로 진행됐는데, 이탈리아 악센트(맞나?)라서 내가 이해할 수준이 아니구나 싶어 바로 통역 버전을 들었다. 그러나 이런 전문 분야 컨퍼런스는 통역하시는 분이 참 고생이 많다고 느꼈을 정도로 매끄럽진 않았다.

대충 알아먹기로는 회사를 옮기는 곳마다 여러 시도를 했고, 그걸 꽤 잘했다…정도 유치한 감상 밖에 남길 수 없는데…

당시 메모한 것에는 좋은 이야기가 많이 적혀있는데, 맥락을 잘 이해 못하는 관계로 묻어두기로 한다.

그 분의 그런 경험에서 단편적인 사실만 나열한다는 느낌도 들었는데, 그간의 고민이 잘 드러나지 않는다고 느꼈다. QA를 오래했으면 꽤 괜찮은 인사이트를 얻을 수 있었을 것도 같다. 그 열점이 안타까울 정도로 열심히 발표해주셨다.

AI 프로젝트에 Agile을 도입했더니 나만 찌질거리는 것 처럼 느껴졌던 5가지 이유 - 도경태

이 분은 나름 유명하시기도 하고 발표 경험도 많은 분이라 믿고 들어갔다. 발표에 개그 포인트가 매우 많았음에도 전혀 웃음이 터지지 않았다. 청중의 연령이 좀 많은 것인가, 아니면 너무 진지하게 듣고 있는 건가, 아니면…

아무튼 연구자와 엮일 일이 없는 나로서는 크게 도움될 이야기는 없긴 한데, 그럭저럭 재미있게 잘 들었다.

안정지향적 조직에서 어떻게 애자일을 적용할 것인가? - 정광섭

개인적으로 아는 분이라서 들으려고 했으나 사실 그 시간대 땡기는 세션이 전혀 없기도 했다. 그런데 처음부터 전에 들었던 발표 내용이 나오길레 잠시 다른 세션에 한눈 팔고 오기로 했다. 역시나 딱히 땡기는 세션이 없었고 사춘기 10대처럼 방황하다 제자리로 돌아왔다. 그러자 5분만에 끝. 아쉬웠다. 안정지향적 조직 이야기 좀 듣고 싶었는데.

애자일 코치로의 축적의 시간 - 고종범

이 분도 유명해서 발표를 잘 하시겠지 하고 들어갔었는데, 나름 재밌게 들은 것 같은데 무슨 내용이었더라…

며칠 됐다고 벌써 기억이 안나다니…

좋…좋았다고 결론을 내보자…

오렌지라이프의 Agile 조직문화 내재화 사례 - 천지원

가장 듣고 싶었고, 가장 좋았던 발표였고, 가장 중요한 내용을 다루고 있다고 생각한다.

일단 다른 발표자들과 다르게 또랑또랑하고 delivery가 훌륭했다.

오렌지라이프가 애자일을 도입하는 과정을 설명해줬는데, 올해는 한동안 애자일 모임을 가면 오렌지 라이프 이야기가 빠지지 않았더랬다.

오렌지라이프가 성공적으로 애자일 전환을 이룬 것은 사장님이 엄청나게 적극적이었고, 스스로 모범을 보였기 때문이다. 예를 들어,

  • 사장님이 먼저 해외에 나가 애자일을 배워오고 전파했다
  • 성급하게 도입하지 않고 조직에 자연스레 전파되도록 많은 노력을 했다
  • 전사의 모든 스크럼 미팅을 최소 한번은 참여했고, 나눌 이야기에 대해 미리 알고 오며, 참석자의 이름도 미리 보고 온다

그렇다면 이 글을 읽는 여러분의 회사에선 이루어지지 않을 것이란 뜻이기도 하다.

스폰서쉽이 얼마나 중요한지, 조직이 애자일하게 변하는 과정이 얼마나 오랜 시간을 필요로 하는지 잘 알 수 있었다.

그렇다면 이 글을 읽는 여러분의 회사에선 이…

Agile, Sociocracy & Facilitation - 주현희

올 해 일정이 생겨 못 간 월간 밋업에서 발표하셨던 내용인 것 같은데, 반응이 꽤 괜찮았던 것 같아서 궁금했던 차.

Sociocracy라는 Democracy를 넘어 스스로 역동적으로 움직이는 조직을 만드는 것에 관한 이야기다.

올해 이뤄진 회사의 조직 개편 구조에서는 Tech Lead가 외부와의 접점이 되고 팀원들을 수동적으로 만드는 경향이 있어 고민이 많은데, 이 분이 말씀하시는 소시오크라시와 내가 원하는 방향이 맞다는 느낌이 들었다. 그러나 소시오크라시에 관한 이야기만 해도 꽤나 분량이 많아서 대략의 개념만 소개해주신 것으로 이해하고 있다. 발표 자체는 좋았지만, 뭔가 구체적인 것이 부족했다는 느낌이 남아있다.

Epilogue

요즘 읽는 책.

카이젠 저니 이미지

전통적인 방식으로 서비스를 찍어내는 회사에서 점진적으로 애자일하게 개선(카이젠)해 나가는 과정을 소설의 형식으로 보여준다. 그 과정에서 느낄 수 있는 멤버들의 감정이나 갈등도 세심하게 표현하고 있어, 나처럼 애자일 프로세스가 여전히 낯선 사람이라면 읽어볼 만 하다.

여기에서 다양한 실천 방안이 소개되는데, 겸사겸사 나도 팀 관리 방식을 바꿔보려고 읽으면서 메모해놓고 시도해보려 한다.

지금은 지라 스프린트보드와 화이트보드+포스트잇을 모두 활용하고 있는데, 이건 또 별도의 포스트에서 다루기로 하고,

같이 컨퍼런스에 참여했던 동지들과 점심을 먹기로 했다. 이번 컨퍼런스에서 얻은 가장 큰 수확 중 하나다.

Php_annotated_monthly 이미지

Roman Pronskiy가 쓰고 JetBrains에서 제공하는 월간 PHP Annotated Monthly 2019년 10월호의 번역본입니다.

이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.


⚡️ News & Releases

GitHub announced Dependency graph support for PHP repositories with Composer dependencies

https://github.blog/2019-09-18-dependency-graph-supports-php-repos-with-composer-dependencies/

Github에서 PHP repository를 위한 Dependency graph를 지원하기로 했습니다. composer.json과 composer.lock 안의 프로젝트에서 취약성이 발견되면, 보안 경고를 받을 수 있게 됐습니다.

public 저장소는 자동으로 알람을 받게 되고, private은 설정을 통해 가능합니다. 이를 자동으로 수정해주는 PR을 받을 수도 있습니다(베타).

Upgrading PSR interface. PHP-FIG wants your help to modernize PSRs!

https://www.php-fig.org/blog/2019/10/upgrading-psr-interfaces/

PHP에 새로운 타입이 계속 추가되지만(PHP 8에는 union type까지!) PSR은 계속 작성 당시의 PHP 버전을 기준으로 남아있습니다. 의미상 큰 변화가 없는 PSR 스펙이라면 새로 만들지 않고 기존 스펙을 최신화하려는 논의가 되고 있는데, 최신 PHP 스펙을 기준으로 PSR을 업그레이드 지원하자니 이를 지원하지 않는 라이브러리의 호환성 때문에 여러가지 방안을 고민했다고 합니다.

현재의 안은 PSR에 버전을 붙이고(v2, v3..) 여러 단계로 릴리즈 하는 것입니다. 새로운 타입을 도입할 경우 기존 PSR을 따르던 라이브러리들이 하위 호환을 해칠 수 있기 때문에(여기서는 PHP 7.2에 소개된 ‘제한적인’ 공변/반공변을 예로 듭니다), 하위 호환을 해치지 않는 수준의 PSR v2를 발표하고 라이브러리들이 v1과 v2를 모두 만족하게 반영할 시간을 줍니다. 그 뒤에 PSR v2와 호환되는 v3를 발표하고 라이브러리들이 v2와 v3에 호환되도록 시간을 줍니다. 이때 v1에는 하위호환이 깨질 수 있습니다만, 이 논의가 시작된 원인이었던 (PSR v1의 breaking change를 걱정해야할) PHP 7.2는 이미 레거시 릴리즈에 돌입했으므로 큰 문제는 되지 않을 것이라는 내용입니다.

이 방향이 맞을지 커뮤니티에 설문을 돌리고 있습니다.

PHP 7.4.0 RC3

https://externals.io/message/107366

일정에 따라 새로운 PHP 7.4 RC가 나왔습니다. 이제 PHP 7.4까지 3개의 RC만을 남겨놓고 있습니다!

security updates

변경 사항은 여기서 확인하세요.

🐘 PHP Internals

[RFC] Object Initializer

https://wiki.php.net/rfc/object-initializer

새로운 객체 초기화 문법 제안이 올라왔습니다! (targets PHP 8.0)

저자의 블로그 포스트에서 간단한 설명과 예시를 확인하실 수 있습니다.

기존의 장황한 객체 초기화 문법을

$customer = new Customer();
$customer->firstname = "John";
$customer->surname = "Doe";
$customer->phoneNo = "+1 (555) 333 222";
$customer->emailAddress = "john.doe@example.com";
$customer->dateOfBirth = DateTimeImmutable::createFromFormat("Y-m-d", "1983-01-01");

몇몇 언어에서 제공하는 것처럼 깔끔하게 정리할 수 있습니다.

$customer = new Customer {
firstname = "John",
surname = "Doe",
phoneNo = "+1 (555) 333 222",
emailAddress = "john.doe@example.com",
dateOfBirth = DateTimeImmutable::createFromFormat("Y-m-d", "1983-01-01")
};

PHP Internals News #30. 팟캐스트에서 더 자세한 이야기를 들으실 수 있습니다.

꽤나 매력적이지만, (10/9 현재 voting 단계) 찬성3에 반대18로 분위기는… 물건너 갔습니다.

[RFC] Reclassifying engine warnings

https://wiki.php.net/rfc/engine_warnings

지난 달 9월호에서 소개했던 RFC의 투표 결과에 따라 PHP 8.0에선 다음과 같은 변화가 있을 것입니다.

  • Undefined variables: Warning
  • Undefined array index: Warning
  • Division by zero: Exception. 추가로 0으로 나누는 것을 허용하는 fdiv() 함수가 추가됩니다
  • Invalid argument supplied for foreach(): Warning
  • 기타 투표를 통과한 다른 변경 사항

Nikita Popov와의 podcast 🔈에서 더 자세히 들어보실 수 있습니다. PHP Internals News #29

PHP project coordination

https://blog.jetbrains.com/phpstorm/2019/10/php-annotated-october-2019/

Internals가 또 한번 혼란스러웠지만, 좋은 일도 있었습니다. Dan Ackroyd가 현재 진행중인 논쟁과 작업을 정리하고 있습니다.

🛠 Tools

cycle/orm

https://github.com/cycle/orm

훌륭한 PHP DataMapper ORM이자 Data Modelling Engine이라고 합니다. 고전적인 PHP 어플리케이션에도, ActiveRecord 방식으로도 사용할 수 있다고 합니다. documentation도 좋습니다.

ssx/skrub

https://github.com/ssx/skrub

필요없는 파일을 삭제해서 Docker image를 작게 만드는 등 공간을 절약해주는 composer 플러그인

squizlabs/PHP_CodeSniffer 3.5.0

https://github.com/squizlabs/PHP_CodeSniffer

이제 PSR-12 스펙을 완전히 지원합니다.

voku/portable-ascii

https://github.com/voku/portable-ascii

ASCII 문자열로 변환해주는 성능 좋은 라이브러리

infection/infection 0.14.0

https://github.com/infection/infection

A framework for mutation testing in PHP. The new version adds 3 mutators, and has better performance, decreased memory consumption, and other improvements.

solodkiy/mysql-error-parser

https://github.com/solodkiy/mysql-error-parser

alecrabbit/php-console-spinner

https://github.com/alecrabbit/php-console-spinner

훌륭한 CLI spinner입니다.

php-console-spinner example

Symfony

API Platform 2.5

https://dunglas.fr/2019/09/api-platform-2-5-revamped-admin-new-api-testing-tool-next-js-and-quasar-app-generators-patch-and-json-schema-support-improved-openapi-and-graphql-support/

Revamped Admin, new API testing tool, Next.js, and Quasar app generators, PATCH and JSON Schema support, and improved support for OpenAPI and GraphQL.

shopsys/http-smoke-testing

https://github.com/shopsys/http-smoke-testing

Simple HTTP smoke-testing for your Symfony application.

The Symfony Framework Best Practices

https://symfony.com/doc/current/best_practices.html

The Symfony Framework의 Best Practice를 한곳에 모아두었습니다.

Symfony adds a String component

https://github.com/symfony/symfony/pull/33553

an OO way of dealing with strings.

Laravel

spatie/laravel-model-states

https://github.com/spatie/laravel-model-states

The package adds state support to models. It combines concepts from the state pattern and state machines.

Hunternnm/laravel-roadrunner

https://github.com/Hunternnm/laravel-roadrunner

RoadRunner에서 Laravel을 실행하기 위한 간단한 bridge입니다.

RoadRunner는 an open-source (MIT licensed) high-performance PHP application server, load balancer, and process manager라고 소개하고 있네요.

envant/fireable

https://github.com/envant/fireable

Laravel에서 attribute 변경을 우아하게 처리하는 방법. “dirty” 속성을 활용해서 직접 이벤트를 발생시키지 않고 선언적으로 구현합니다.

다음은 status가 appoved 혹은 rejected로 변함에 따라 이벤트를 발생시키는 예제.

class User extends Authenticatable
{
use FireableAttributes;

protected $fireableAttributes = [
'status' => [
'approved' => UserApproved::class,
'rejected' => UserRejected::class,
],
];
}

Laravel with docker-compose

https://medium.com/swlh/laravel-with-docker-compose-de2190569084

Laravel을 docker-compose로 구성하는 과정을 상세하게 정리했습니다.

Introducing “ddd” – a new global helper in Laravel 6

https://flareapp.io/blog/1-introducing-ddd-a-new-global-helper-for-laravel

Laravel 6를 설치하면 Ignition 1.9 이상을 사용할 수 있으므로, 기존의 dd() 헬퍼 함수와 Ignition 라이브러리를 조합하여, ddd()라는 더 편리한 헬퍼 함수를 만들었습니다.

Inertia.js and Livewire: a high-level comparison

https://sebastiandedeyne.com/inertia-js-and-livewire-a-high-level-comparison/

React나 Vue.js와는 다르게 서버 프레임웍 플러그인으로써 UI를 손쉽게 구성할 수 있게 도와주는 두 라이브러리를 비교합니다.

🎥 WRITING A GAME IN LARAVEL AND REACT – STREAM ROUNDUP WEEK 1

https://blog.hock.in/2019/09/04/writing-a-game-in-laravel-and-react-stream-roundup-week-1/

Laravel과 React.js로 deck-building 게임(뭔지 몰라서 찾아보니 이런 것이군요)을 만들어가는 과정을 유투브 스트리밍합니다. 설계하고 테스트를 작성하고 진행하는 과정이 꽤나 흥미롭네요. 스트리밍 과정에서 나온 설계 결정이나 고민을 블로그에 옮겨놓고 있습니다.

🎥 Testing Laravel

https://www.youtube.com/playlist?list=PLmwAMIdrAmK7SHlZRwc73GGjQ9AEFGu7g

Jason McCreary의 Laravel에서의 테스트 시리즈입니다.

🎥 Laracasts: Laravel 6 From Scratch.

https://laracasts.com/series/laravel-6-from-scratch

🌀 Async PHP

seregazhuk/php-watcher

https://github.com/seregazhuk/php-watcher

소스가 변경되면 PHP 어플리케이션을 재시작 해주는 패키지입니다.

🎥 Creating a RESTful API with ReactPHP

clue/reactphp-docker

https://github.com/clue/reactphp-docker

Async client for the Docker Engine API. 소개글도 읽어보세요.

💡 기타 읽을 만한 글

Matthias Noback: Using phploc for a quick code quality estimation

https://matthiasnoback.nl/2019/09/using-phploc-for-quick-code-quality-estimation-part-1/
https://matthiasnoback.nl/2019/09/using-phploc-for-quick-code-quality-estimation-part-2/

(PHPUnit도 만든) Sebastian Bergmann의 phploc은 PHP 어플리케이션의 구조와 크기를 분석하는 도구입니다. 이 툴이 보여주는 결과를 어떻게 해석할지 설명합니다.

doganoo/PHPAlgorithms

https://github.com/doganoo/PHPAlgorithms

“Cracking the Coding Interview” 시리즈의 PHP 버전입니다.

https://www.exakat.io/most-popular-php-magic-methods/

1705개의 오픈소스에서 magic method가 얼마나 쓰였는지 조사한 결과입니다. 한번이라도 프로젝트에서 선언되었다면 카운트되었습니다.

PHP most popular magic methods

여기서 알게된 사실 몇가지도 나와있는데요.

  • 모든 magic method가 꽤 많이 사용됩니다
  • 가장 많이 쓰이는 건 __construct()인데, 클래스에서 거의 의무적으로 쓰이는 것에 비해 63%밖에 쓰이지 않았다는 것은 놀랍습니다
  • __toString()가 의외로 많이 사용됩니다
  • __debugInfo()는 PHP 5.6에서 소개됐습니다
  • __get()__set()보다, __sleep()__wakeup()보다 많이 쓰입니다
  • __destruct()__construct()의 반 밖에 쓰이지 않습니다
  • __serialize()__unserialize()는 7.4에서만 사용 가능합니다. 이런 프로젝트들은 이미 호환 가능하거나 리팩토링이 필요해 보입니다.

A Detailed Explanation of Abstraction in Software Development

https://thevaluable.dev/abstraction_software_development/

추상화에 관해 심층적인 접근을 합니다.

  • 예제와 함께 추상화가 무엇인지 정의합니다
  • 소프트웨어 개발에서 찾을 수있는 다양한 종류의 추상화를 다룹니다
  • 추상화 사용의 장점과 단점을 분석합니다
  • 종종 서로 연결되어 있지만 상호 호환되지 않는, 추상화와 간접 참조의 차이점을 이해합니다

꽤 긴 글이지만 구글 번역기로 돌려봐도 어렵지 않게 이해할 수 있습니다.

Bootstrapping a CLI PHP application in Vanilla PHP

https://dev.to/erikaheidi/bootstrapping-a-cli-php-application-in-vanilla-php-4ee

순수하게 PHP 만으로 CLI 어플리케이션을 만드는 과정입니다.

gabrielrcouto/awesome-php-ffi

https://github.com/gabrielrcouto/awesome-php-ffi

PHP 7.4에 적용되는 FFI의 다양한 예제를 모아둔 사이트입니다.

Examples in this repository:

  • Game Boy Emulator
  • Game Boy Emulator with SDL2 rendering
  • GTK3 window with a button
  • Calling a function from .class Java file
  • Modifying the PHP Core to auto inject PHP Open Tag
  • Simple printf example
  • Creating window and rendering pixels with SDL2
  • SNES Emulator
  • SNES Emulator with SDL2 rendering
  • text-to-speech using Mac library
  • Other repositories about PHP FFI:

DBus access via FFI and PHP 7.4 POC

  • Driving webview using PHP 7.4 FFI
  • PHP wrapper for libsass using FFI
  • PHP TensorFlow Binding
  • FFIMe
  • A compiler. For PHP

More than RCE

https://medium.com/swlh/diving-into-unserialize-more-than-rce-d48d371db7da

RCE(Remote Code Execution) 권한을 얻는 방법에 관한 포스트 Diving into unserialize()에 이어 unserialize()의 취약점을 이용해서 인증을 피하고 SQL injection을 시도하는 방법을 소개합니다.

🔈 Podcasts

🎥 Derick Rethans streams Hacking on Xdebug – If you use Xdebug, consider supporting Derick on Patreon. If you are not using Xdebug… well, you are probably working way too hard.

  • Xdebug를 사용한다면 Derick을 후원해주세요

🔈 PHP Internals News #28 – With Andreas Heigl on moving PHP documentation from SVN to Git.

🔈 PHP Internals News #27 – With Nikita Popov оn the help request for adding type declaration to builtin functions.

🔈 Voices of the ElePHPant: It’s the Booze Talking: PHP, the next 25.

💬 Community

ElePHPant.me

https://elephpant.me/

PHP의 마스코트인 ElePHPants 인형을 많이 수집한 사람의 랭킹을 보여주고 트레이드도 할 수 있는 사이트입니다. 한국에선 아직 등록한 사람이 없네요.

Php_annotated_monthly 이미지

Roman Pronskiy가 쓰고 JetBrains에서 제공하는 월간 PHP Annotated Monthly 2019년 9월호의 번역본입니다.

이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.


⚡️ News & Releases

PHP 7.4.0 RC1

https://www.php.net/index.php#id2019-09-05-1

7.4 버전의 release-candidates cycle이 시작되었습니다. GA(General Availability) release까지 최소 6번의 RC가 진행될 예정입니다.

PHP 7.1.32, PHP 7.2.22, PHP 7.3.9

https://www.php.net/archive/2019.php#2019-08-30-1
https://www.php.net/archive/2019.php#2019-08-29-2
https://www.php.net/archive/2019.php#2019-08-29-1

임의의 코드를 실행할 수 있는 심각한 취약점이 몇가지 수정되었습니다. 이 취약점이 악용되었다는 보고는 아직 없는 것 같습니다. 내용은 각 change log에서 확인하실 수 있습니다.

Monolog 2.0.0

https://github.com/Seldaek/monolog/releases/tag/2.0.0

처음 언급된 이후 4년이 지나 2.0이 발표되었습니다.

PHP 7.2부터 지원하고, 가능하다면 type hint를 제공하고, strict_type mode를 지원하며, 새로운 핸들러(SqsHandler, TelegramBotHandler 등)를 추가했습니다. Deprecated 됐던 일부 핸들러(RavenHandler, SlackbotHandler 등)는 제거됐는데 README 페이지에서 대체품을 확인할 수 있습니다.

Monolog 1.x도 계속 지원한다고 합니다.

🐘 PHP Internals

Straw poll for P++ feasibility

https://wiki.php.net/rfc/p-plus-plus

지난 달 소식에서 소개된 P++의 타당성에 관한 설문 조사가 있었고, 이 아이디어는 완전히 불가능한 것으로, PHP 커뮤니티에서 만장일치로 거부되었습니다.

[PoC] throw_legacy_failure declare statement

https://github.com/php/php-src/pull/4549

흥미로운 PoC(proof of concept)이 있었다는 군요.

기존 오래된 PHP function들이 동작을 계속할 수 없을 때 null이나 false를 return하던 것을 Exception을 throw하는 것으로 대체하고 있습니다. 물론 모든 null/false return을 throw로 대체한다는 것은 아닙니다. strpos에서 needle을 찾을 수 없을 때 false를 리턴하는 것은 정상 동작으로 고려합니다.

적용 방식은, 파일 단위로 strict_types를 선언하고 이어서 declare(throw_legacy_failure=1)처럼 추가 선언하는 식으로 구현되었습니다.

[RFC] Reclassifying engine warnings

https://wiki.php.net/rfc/engine_warnings

Nikita Popov는 이 제안에서 PHP 엔진에 존재하는 warning과 notice를 살펴보고 그들의 분류가 여전히 적절한지 재평가 할 것을 제안합니다. “Undefined variable” 같은 건 최소한 Warning은 되어야 한다는 식이죠.

[RFC] Union Types v2

https://github.com/nikic/php-rfcs/blob/union-types/rfcs/0000-union-types-v2.md

2015년의 Bob & Levi의 제안을 이어받아 PHP 8에 Union Type을 추가할 것을 제안합니다.

어디서든 타입을 선언할 때 여러 타입을 명시할 수 있습니다.

class Number {
private int|float $number;

public function setNumber(int|float $number): void {
$this->number = $number;
}

public function getNumber(): int|float {
return $this->number;
}
}

특히 이번 RFC가 흥미로운 것은 GitHub 기반의 RFC workflow를 실험해보고 있다는 사실입니다. Nikita가 php-rfcs라는 저장소를 만들어서 올린 것입니다. 아무나 토론에 참여할 수 있었고, 이모지로 표현하기도 했습니다. RFC 토론에서는 거의 볼 수없는 기술적 세부 사항에 대한 많은 토론이있었다고 합니다.

이에 대한 Nikita의 감상은 여기서 확인하실 수 있습니다.

In PHP 8 error_reporting will be E_ALL by default

https://github.com/php/php-src/pull/4659/files

PHP 8에서는 현재의 E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED 대신 E_ALL로 변경됩니다.

🛠 Tools

RubixML/RubixML

https://github.com/RubixML/RubixML

PHP에서 machine learning을 사용하며 활발히 개발되는 패키지입니다. 여러가지 좋은 예제가 많습니다.

휴대폰 센서 데이터를 활용해 앉기, 일어나기, 눞기 등의 인간 행동을 분류하는 classifying human activities, 이미지로부터 사물을 인식하는recognition of objects on images, 주택 가격을 예상하는 predicting house prices.

Nyholm/psr7

https://github.com/Nyholm/psr7

A lightweight and strict PSR-7 implementation.

ivopetkov/html5-dom-document-php

https://github.com/ivopetkov/html5-dom-document-php

기존의 DOMDocument를 확장하고 수정한 HTML5 파서입니다.

quasilyte/phpgrep

https://github.com/quasilyte/phpgrep

PHP 코드를 찾기 위한 검색 툴입니다. Grep과 비슷한데, PHP 문법을 이해하는 점이 다릅니다. Go에서 구현되었고, mvdan/gogrep에서 영향을 받았습니다. PhpStorm의 Structural Search and Replace (SSR)와도 비슷합니다.

더 자세한 건 이 발표자료를 통해 확인하실 수 있습니다.

voku/portable-utf8

https://github.com/voku/portable-utf8

Unicode 문자열을 처리하는 UTF-8 library입니다. “mbstring”이나 “iconv” 혹은 다른 PHP extension을 쓰지 않고도 사용할 수 있습니다. Github README에서 많은 예제를 확인하실 수 있습니다.

PHPCompatibility/PHPCompatibility 9.3.0

https://github.com/PHPCompatibility/PHPCompatibility/releases/tag/9.3.0

다양한 PHP 버전과의 호환성을 검사하는 PHP_CodeSniffer를 위한 문법 세트입니다. PHP 7.4가 추가됐군요.

nunomaduro/yorn

https://github.com/nunomaduro/yorn

JavaScript 스타일의 ‘import’ / ‘export’ 문법을 쓸 수 있게 해주는 PoC 코드입니다.

import, export 예제

이전에도 비슷한 시도는 있었다고 하는군요.

Symfony

Sylius 1.6

https://sylius.com/blog/sylius-1-6-with-refreshed-admin-and-headless-ecommerce/

Symfony 기반의 인기있는 e-commerce platform이 버전업 했다는 소식.

Abstracting API calls with Symfony serializer.

https://tech.yappa.be/abstracting-api-calls-with-symfony-serializer

Symfony serializer로 API 요청을 3 단계로 추상화하는 방식을 소개합니다.

  • The API endpoints (clients)
  • Request data models
  • Response handlers

Creating a dockerised Symfony application and a Makefile based build script.

http://www.inanzzz.com/index.php/post/fr4t/creating-a-dockerised-symfony-application-and-a-makefile-based-build-script

Validate an object based on its previous version.

https://medium.com/@ger86/symfony-validate-an-object-based-on-its-previous-version-4b6ca7a85dc6

Object의 기존 상태를 기준으로 validation을 처리하는 방법을 소개합니다.

Validator component에 Doctrine의 UnitOfWork 컨셉을 적용합니다.

Laravel

Laravel 6

https://laravel-news.com/laravel-6

Laracon EU conference에서 가 언급되었습니다(이 글을 읽는 시점에 이미 발표가 됐죠). LTS release에 3년 간 security updates를 받을 수 있습니다. Semver를 따르기로 했고, 첫번째 버전 숫자가 좀 더 빠르게 증가한다는 의미입니다. 7버전은 이번 겨울에 발표될 예정입니다. Laracasts에서 Laravel 6에 대해 더 알아보세요.

facade/ignition

https://github.com/facade/ignition

Laravel 6는 완전 새로운 error page를 선보였습니다. Whoops에 기초하고 있으나 더 많은 정보를 보여주고 여러분이 브라우저를 떠나지 않고도 문제를 수정할 수도 있습니다.

Videos from Laracon US 2019

https://www.youtube.com/playlist?list=PL-yJve--iT5qZzp0VzYaPA7ZohLl6tSdp

PHP Townhall #68: Behind the Facade

https://phptownhall.com/episode-68-behind-the-facade-2019/

Matt Trask와 Ben Edmunds가 Taylor Otwell의 초대로 Laravel의 새로운 점과 비즈니스적인 면, 그리고 거대한 컨퍼런스를 조직하는 일 등을 이야기 합니다.

🌀 Async PHP

Creating a RESTful API with ReactPHP

ReactPHP에 관한 두개의 동영상을 소개합니다.

Improving HTTP responses
Managing Orders

apisearch-io/symfony-async-kernel

Symfony 기반의 Async kernel입니다. Demo 어플리케이션도 확인해보세요 : apisearch-io/symfony-react-demo

clue/reactphp-stdio

https://github.com/clue/reactphp-stdio

ReactPHP로 interactive한 CLI-tool을 만들 수 있는 툴입니다.

사용자 키 이벤트가 발생하자마자 응답 할 수 있는 방법을 여기서 더 확인해보세요.

💡 기타 읽을 만한 글

How to use data providers in PHPUnit

https://blog.martinhujer.cz/how-to-use-data-providers-in-phpunit/

PHPUnit에서 Data Providers를 활용하는 방법입니다. 여러분이 잘 몰랐던 부분도 있을 겁니다.

  • Tip #1: Always name the data providers
    • 이름을 꼭 넣어서 테스트 결과의 가독성을 높여주기
  • Tip #2: You can run single data set from data provider
    • filter를 통해 특정 data set만 사용
  • Tip #3: Add type definitions
    • 가능하면 data provider나 test 함수 인자에 타입을 정의할 것
  • Tip #4: Data providers are supported well in PhpStorm
  • Tip #5: More complex data providers
    • 동적으로 데이터를 생성할 수도 있음
  • Tip #6: You can use Closures in Data providers to delay evaluation
    • 클로저 활용
  • Tip #7: Use yield to simplify large nested arrays
    • 배열이 너무 중첩되었다면 yield를 사용해서 가독성을 높일 수는 있으나 모든 yield는 테스트 시작 시점에 evaluated 됨
  • Tip #8: Don’t use @testWith annotation
    • 주석은 당신의 코드를 넣기에 적당한 곳은 아니다
    • syntax highlighting does not work there
    • IDE code validation does not work there
    • automatic code formatting does not work there
    • it cannot be analysed statically by PHPStan

From LAMP to serverless

https://mnapoli.fr/serverless-case-study-externals/

AWS Lambda에 Bref를 통해 serverless PHP 어플리케이션을 올리는 예제입니다.

PHP internals의 내용을 외부에 공개하는 Readonly 웹사이트인 externals.io를 LAMP에서 Serverless로 마이그레이션 했던 과정과 결과를 분석합니다.

이외에 더 많은 case study는 여기서 확인하실 수 있습니다.

A first look at Slim 4

https://akrabat.com/a-first-look-at-slim-4/

Analysis of SQLi and PHP Object Injection vulnerabilities in SuiteCRM

https://blog.ripstech.com/2019/breaking-into-your-internal-network/

SuiteCRM을 사용하시는 분들은 최대한 빨리 최신 버전으로 업그레이드 하시랍니다.

Being explicit about entity managers

https://blog.kennard.dev/2019-08-28-being-explicit-about-entity-managers/

Videos from the Blackfire meetup at Datadog NYC HQ

https://www.youtube.com/playlist?list=PLsXp_S76lr5ddg4xs_BjcdlNjtVE9ulNo

Blackfire meetup에서의 발표 동영상 셋입니다.

  1. Profiling PHP apps with Blackfire
  2. Tracing: Flame graphs of your production PHP
  3. Developing cacheable backend applications

특히 3번 동영상은 PHP backend 어플리케이션에서의 다양한 캐싱 방법을 소개합니다.

🔈 Podcasts

PHP Internals News #24, PHP Internals News #25

  • With Stanislav Malyshev on security related aspects of PHP development and using a fuzzer to test the input safety of data coming into PHP.

PHP Internals News #26

  • With Nicolas Grekas about how the Symfony project approaches the task of making it ready for PHP 7.4.

php[architect] – Symfony 4, legacy code, the future of PHP, and Karl Hughes.

No Plans to Merge – @DCoulbourne and @calebporzio talk about Laravel 6 and other things.

💬 Community

Matthew Weier O’Phinney is looking for new adventure

https://mwop.net/blog/2019-09-03-looking-for-a-new-adventure.html

Zend Framework(Laminas)의 Lead이자 PHP-FIG의 창립 멤버인 Matthew Weier가 무려 14년이나 일했던 Zend를 나왔다는 이야기입니다.

리모트로만 일한다고 하니 요즘 사람 구하기 어려우신 분들은 연락 한번…

Brent Roose and Joe Watkins exchanged opinions on where the PHP team is right now, and what can be done to make it better

Brent Roose가 PHP team에 공개 메일을 보냈습니다. - A letter to the PHP team

  • 최근에 한번 프로세스가 변경이 되긴 했지만(더 긴 투표 시간과 2/3 이상의 찬성), 현재의 RFC 방식은 너무 폐쇄적이며, 반복적으로 RFC가 올라오고 토론하고 싸우고 논란이 됩니다(최근의 예로는 short tag에 관한 토론). 타 언어의 예로 들어 좀 더 개방적으로 토론할 것을 제안합니다. ECMAScript 진영에서는 Dr. Axel Rauschmayer의 훌륭한 포스트에서 보는 것처럼 TC39 process가 동작하는 방식을 알 수 있고, Rust의 공개 포럼의 예도 있습니다. TC39는 언어가 어떻게 진화 할 수 있는지에 대한 명확한 틀을 제공하며, PHP 의 현재 RFC 프로세스 보다 우수하고 혼동되지 않는 시스템입니다.

여기에 Joe Watkins가 응답합니다. - Bearings

  • PHP 내부에는 사실 파벌이란 것이 존재하지 않고, short tags 논란에서는 RFC의 기고자의 잘못이 있긴 해도 프로세스 상의 실패이기도 하므로 공식적인 deprecation 정책을 생각해볼 때가 된 것 같습니다. 그러나 최근 몇 개의 토론 만으로 PHP 프로세스에 대해 결론을 내리고, 그 결론에 대한 해법을 내는 것은 의미가 없습니다.
  • 프로세스를 변경하는 시간과 노력은 상당하며, 프로세스가 실패했거나 실패할 가능성이 있을 때만 우선 순위에 둡니다. 세부적으로는 다르지만, 다른 오픈 소스 프로젝트도 동일한 프로세스로 작동합니다. 규칙을 정하고, 사람들이 따르도록 노력하며, 중단되면 수정합니다.
  • 메일 링리스트가 의사 소통하기에 좋은 방법이라고 주장 할 수는 없지만 그것이 우리가 가진 것입니다. 그러나 이것이 우리가 가진 전부는 아닙니다. 이메일/Github PR에 대한 토론/IRC #php.pecl …
  • 투표에 참여하는 사람이 PHP 커뮤니티를 대표하지 않는다는 의견에는, 투표권을 받기 위해 노력하기 힘들 정도로 시간이 없다면 책임감있게 공헌할 시간이 없는 것일 수도 있습니다. internals가 아닌 리드 프레임웍 개발자 등에 투표권을 부여하는 제도도 있고, 일부는 참여하고 있습니다.

다시 Brent Roose가 응답합니다. - Reply to Joe

  • P++을 언급했지만 그전부터 이 글을 준비 했으며, 그걸 파벌이라고 부르든 아니든 큰소리가 들립니다. 예를 들어, Reclassifying engine warnings, Short open tags, Namespace-scoped declares, Explicit call-site send-by-ref syntax, Deprecations for 7.4…
  • 항상 이런 식으로 진행됩니다. Nikita는 언어를 앞으로 진전시키려고 하고, Zeev와 Stas는 언어 호환성을 지키려 하고, Sara는 중간 지점을 유지하려고 하고, Dmitry는 어딘가에서 PHP 8을 연구하고 있습니다.
  • 규칙을 지키는 것이 중요하다고 말하고 있지만, 그건 낡은 방식의 규칙이고 이제는 우아하고 현대적인 규칙이 필요합니다.
  • 핵심 기고자는 많지 않으며 동일한 토론을 읽고 답장하는 데 많은 시간을 소비해야합니다.
  • 언급했던 그 모든 채널로도 핵심 개발자와 사용자 개발자 간의 격차를 해소하지 않는 것 같습니다.
  • 토론에 참여하고 싶어도 본인(Brent Roose)조차 그 방법이나 대상이 누군지 명확히 알기 어렵고, 이것이 소통이 실패한 하나의 예입니다.

이 논쟁이 영향을 줬는지는 확실치 않지만, 이후 (이번 달 PHP internals에도 소개된 것처럼) Nikita가 Github 기반의 RFC workflow 제안하기도 했습니다.

One interesting thought from Joe

https://twitter.com/krakjoe/status/1167459152786087936

위에서 논쟁을 벌였던 Joe Watkins가 올린 트윗입니다.

PHP 에코시스템에서 가장 중요하지만 부족한 것은, generics나 typed variables이 아니라 펀딩이다. Xdebug, PHPUnit, composer처럼 그들이 현재 무료로 제공하는 것들에 계속 노력할 수 있게 하는 것은 너무나 중요하다.

따라서 당신이 PHP를 사용하고 있다면, 커뮤니티에 되돌려주거나 당신이 쓰는 툴의 개발자들을 지원하는 것을 고려해보세요. 여기 당신이 관심을 가질 만한 몇가지 펀딩 사이트가 있습니다.

Php_annotated_monthly 이미지

Roman Pronskiy가 쓰고 JetBrains에서 제공하는 월간 PHP Annotated Monthly 2019년 8월호입니다.

이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.


⚡️ News & Releases

PSR-12 Extended Coding Style Guide

https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-12-extended-coding-style-guide.md

PSR-12가 정식 표준이 되었습니다. PSR-2에 비해 변경된 점은 여기를 참고하세요. 새로 추가된 부분은 아래와 같습니다.

  • Lowercase for all keywords - Section 2.5
  • Short form for all type keywords - Section 2.5
  • Use statement grouping - Section 3
  • Use statement blocks - Section 3
  • Declare statement/Strict types declaration usage - Section 3
  • Parentheses are always required for class instantiation - Section 4
  • Typed properties - Section 4.3
  • Return type declarations - Section 4.5
  • Variadic and reference argument operators - Section 4.5
  • Type hints - Section 4.5
  • Add finally block - Section 5.6
  • Operators - Section 6
  • Unary operators - Section 6.1
  • Binary operators - Section 6.2
  • Ternary operators - Section 6.3
  • Anonymous classes - Section 8

PHP 7.4.0 beta 2

https://www.php.net/archive/2019.php#2019-08-08-1

PHP 7.4.0 beta 2가 나왔습니다. 이제 활발히 개발되는 단계는 지났습니다. 여기 새 기능 목록이 최종 기능으로 고려되고 있습니다. extension 개발자들은 internal API changes 목록을 확인해보시는 게 좋겠습니다.

PHP 7.3.8, 7.2.21, 7.1.31

나왔어요. 나왔어요. 나왔어요.

Slim 4.0.0

얘도요.

Composer 1.9.0

https://github.com/composer/composer/releases/tag/1.9.0

release note를 한번 볼까요?

  • Added a –no-cache flag available on all commands to run with the cache disabled
  • Added PHP_BINARY as env var pointing to the PHP process when executing Composer scripts as shell scripts
  • Added a use-github-api config option which can set the no-api flag on all GitHub VCS repositories declared
  • Added a static helper you can preprend to a script to avoid process timeouts, “Composer\Config::disableProcessTimeout”
  • Added Event::getOriginatingEvent to retrieve an event’s original event when a script handler forwards to another one
  • Added support for autoloading directly from a phar file
  • Fixed loading order of plugins to always initialize them in order of dependencies
  • Fixed various network-mount related issues
  • Fixed –ignore-platform-reqs not ignoring conflict rules against platform packages

🐘 PHP Internals

P++

https://externals.io/message/106453

PHP Internals에서 removal of short tags <?이나 explicit call-site send-by-ref syntax과 같은 제안에서는 논쟁이 매우 격화된 바 있습니다. 하위 호환을 유지하는 것과 새로운 기능을 넣거나 강력한 타입을 도입하는 것 사이에 마찰이 심했던 것으로 보입니다. Zeev Suraski란 사람이 결국 새로운 PHP 방언(dialect)를 만들자고 제안까지 했습니다. 확정은 아니지만 우선 P++이라는 이름인데 C와 C++의 관계에서 차용한 것으로 보이고, 하나의 런타임에서 PHP와 P++을 동신에 실행하는 것을 제안했습니다.

P++이 받아들여진다면 PHP에서는 여전히 문법과 관련없는 기능 업데이트나 속도와 하위 호환성을 얻을 수 있을 것이고, P++은 하위 호환성을 유지할 필요없이 깨끗하게 legacy를 걷어내고 혁신적인 기능을 구현해나갈 수 있게 됩니다.

Zeev가 올린 P++ idea: FAQ에는 수많은 반대/우려 글이 올라오고 있습니다. PHP에 fulltime으로 일하는 사람이 2명 뿐이고, 커뮤니티의 분열, Hack에서의 경험, 어떻게 PHP와 P++ 코드가 공존하고 상호작용할 수 있겠는가 등. 이외에도 여기, 저기에 많은 논쟁이 일어나고 있습니다.

P++의 이해를 돕기 위해 FAQ 페이지에 나온 이야기 몇개를 소개하자면,

예전에 Nikita Popov가 Rust처럼 Editions을 도입하자고 주장하기도 했는데, 이게 현재를 legacy를 보고 호환성을 끊고 나가겠다는 의미라면, P++은 동적이고 유연한 PHP와 함께 공존한다는 점에서 가장 크게 다릅니다.

그럼 또 하나의 Hack이 나오는 게 아니냐라는 질문에, Hack의 경우에는 하나의 기업에서 관리하면서 커뮤니티가 지원하기도 어려웠고, PHP의 거대한 배포 수단이 없었기에 널리 퍼지기도 쉽지 않았습니다. P++은 PHP와 동일한 런타임으로 제공되기 때문에 쓰지 않더라도 사용할 수 있는 기반은 되는 셈입니다.

사실 이 제안은 P++ 하나 만이 아니라 여러 버전의 방언이 하나의 런타임에서 동시에 제공되는 그림을 그리고 있는데요. 댓글 중에는 결국 그 중에 하나만이 살아남을 것이고 커뮤니티는 파편화 되고, 결국 당장 인기있는 버전만을 신경쓰게 될 것을 우려하고 있습니다.

[RFC] Namespace-scoped declares, again

https://externals.io/message/101323#106345

이 RFC가 위에서 ‘Nikita Popov가 Rust처럼 Editions…’라고 언급된 곳입니다. 링크를 따라가면 Nikita의 댓글이 보이는데, 여기서 두가지를 언급합니다.

하나는 언어의 진화 과정에서 (이 제안처럼) strict_types과 같은 개별 설정을 하나씩 추가해 나갈 것인가, Rust의 Editions처럼 ‘PHP 2020’과 같은 하나의 에디션으로 여러 변경 사항을 묶어서 적용할 것인가입니다. 오래된 문제를 해결하면서도 하위 호환을 무너뜨리지 않기 위한 많은 고민이 보입니다.

그리고 또 하나는 이 세부 구현을 어떻게 하위 호환을 깨뜨리지 않고 구현할 것인가에 대한 고민입니다. 제안은 namespace 단위로 strict_types과 같은 설정을 하는 것인데, 다른 방식으로도 검토했던 내용이 담겨 있습니다.

Call for participation: Annotating internal function argument and return types

https://externals.io/message/106522

PHP core에 contributor가 되고 싶으셨다면, 지금보다 좋을 때는 없을 겁니다.

Reflection의 내부 함수에 type 정보가 부족하다는 것은 오래된 이슈입니다. PHP8에서는 argument와 return type에 대한 annotation을 제공하기 위한 기본 작업은 다 되었는데, 실제로 수백개의 함수에 그걸 추가하는 것이 필요하다고 합니다.

위의 externals.io 링크를 따라가면 샘플 PR과 함게 어떻게 하면 되는지 알려줍니다.

🛠 Tools

krakjoe/tombs

https://github.com/krakjoe/tombs

죽은 코드를 찾아내는 라이브러리입니다. 이 코드를 퍼포먼스 저하 걱정없이 프로덕션에 넣기만 하고, 하루든 일주일이든 한달이든 기다렸다가, 어떤 함수가 한번도 실행되지 않았는지 확인하시면 됩니다. 어떻게 가능한지는 Joe Watkins의 blog post를 확인해보세요.

krakjoe/stat

https://github.com/krakjoe/stat

병렬 쓰레드에서 동작하는 Joe Watkins의 또 다른 프로파일링 extension입니다. 역시 자세한 건 Joe Watkins의 또 다른 blog post를 확인하세요.

nunomaduro/pest

https://github.com/nunomaduro/pest

PHPUnit에서 facebook/jest 스타일로 테스트를 쓸 수 있게 해줍니다.

mpratt/Embera

https://github.com/mpratt/Embera

Embera는 Oembed consumer library입니다. 텍스트에서 특정 서비스의 URL이 발견되면 embed code를 만들어주는 등 해당 미디어의 정보를 가져옵니다.

NxtLvLSoftware/php-static-constructors

https://github.com/NxtLvLSoftware/php-static-constructors

C#의 Static constructors와 같은 개념이랍니다.

exussum12/coverageChecker

https://github.com/exussum12/coverageChecker

전체 코드베이스가 아닌 신규나 변경된 코드에 대해서만 특정 커버리지 이상을 유지할 수 있게 도와주는 툴입니다.

DaveLiddament/sarb

https://github.com/DaveLiddament/sarb

A similar tool that implements a Baseline feature for the quality analysis tools, which allows to use them in legacy-applications.

Symfony

SymfonyCloud

https://symfony.com/blog/symfonycloud-from-early-access-to-general-availability

The service for Symfony applications deployment has come out of beta and is now available to everyone. It allows you to describe the infrastructure in yaml configs and then deploy, update, take snapshots, etc. with one command. See an example of how it was used for redirection.io.

Minor non-LTS releases of Symfony will be supported for 8 months instead of 14.

https://symfony.com/blog/symfony-maintenance-changes-for-standard-releases

A week of Symfony #658 (5-11 August 2019)

https://symfony.com/blog/a-week-of-symfony-658-5-11-august-2019

Decouple your Symfony application using Domain Events

https://romaricdrigon.github.io/2019/08/09/domain-events

Laravel

🎥 Taylor’s talk at Laracon US:

https://www.youtube.com/watch?v=XsPeWjKAUt0

• Laravel 6 will be released in August
• The framework will move to Semver (components already follow it)
• New branding
Laravel New branding
• Laravel Vapor announced – A paid service for deploying Laravel-application in AWS infrastructure: Lambda, RDS, CloudFront, S3, and CloudWatch. It comes with a hosted web interface and a CLI tool for configuring, deploying, and monitoring applications. Neat!

What is AWS Lambda and how Laravel Vapor uses it.

https://divinglaravel.com/what-is-aws-lambda-and-how-laravel-vapor-uses-it

맨 처음 Lambda Layers가 발표됐을 때 SAM 기반으로 PHP 어플리케이션을 띄울 수 있게 해준 Bref와의 차이가 뭐냐는 질문에 Taylor Otwell은 아래와 같이 답했습니다.

Yes a bit different… the whole setup is custom and not based on SAM or Serverless Framework… queue and web are separate lambdas… we have a few PHP extensions that are not on Bref runtime such as GD

🎥 Simplification Tips and Tricks (Laracon 2019)

https://www.youtube.com/watch?v=FxACh4X-Xc0

calebporzio/livewire

https://github.com/calebporzio/livewire

A frontend framework for Laravel that allows you to write bindings in Blade directly to PHP-classes without having to write any additional JS code.

ylsideas/feature-flags

https://github.com/ylsideas/feature-flags

A Laravel package for handling feature flags.

Lower time testing existing Laravel application

https://jasonmccreary.me/articles/lower-time-testing-existing-laravel-application/

Service locator: an anti-pattern

https://stitcher.io/blog/service-locator-anti-pattern

1년 전에 작성된 글이고 전에도 한번 소개됐던 것 같은 기분이지만, 중요하다면 계속 들어도 좋겠죠. 저자는 Service locator의 아래와 같은 문제를 지적합니다.

  • 런타임 오류 가능성이 더 큽니다
  • 코드는 외부로 난독 처리됩니다
  • 인지 부하를 증가시킵니다

🌀 Async PHP

🎥 Creating a RESTful API with ReactPHP

https://www.youtube.com/watch?v=aR3e9pj9TIo&list=PLKIEFFgNQYpWeEvjglhMKUsM1xxKAwgcs

Serverless

Deploying Laravel Artisan on AWS Lambda with bref.

https://blog.deleu.dev/deploying-laravel-artisan-on-aws-lambda/

위 Vapor에서 언급됐던 Bref로 Laravel Artisan을 람다에 올리는 방법입니다.

Another case study for using AWS Lambda and bref.

https://blog.servmask.com/serverless-for-php-developers/

Bref를 활용한 또 다른 사례 연구

Serverless PHP on App Engine + Cloud Firestore and Firevel.

https://medium.com/firebase-developers/serverless-php-on-app-engine-firestore-c22a119dc608

Google App Engine에서 PHP를 실행할 수 있게, Laravel을 수정한 Firevel을 소개합니다. Firestore를 DB와 캐시로 사용합니다. Eloquent가 NoSQL을 고려하지 않았기 때문에 이에 대응하는 Firequent라는 패키지도 개발했다고 합니다.

Firevel 에 포함 된 패키지는 다음과 같습니다.

💡 기타 읽을 만한 글

Dividing responsibilities

https://matthiasnoback.nl/2019/07/dividing-responsibilities-part-1/

Mathias Noback이란 사람의 새 책의 일부 챕터입니다.

책임 분리를 다루면서 읽기와 쓰기 모델을 분리하는 과정을 보여줍니다.

How to write cloud native and container ready PHP applications

https://withblue.ink/2019/07/24/cloud-native-container-ready-php.html

사람들은 여전히 PHP를 싫어한다면서, “PHP는 섹시하지는 않지만 여전히 웹을 지배합니다.”라고 운을 뗍니다.

PHP가 cloud native하게 개발하는데 문제가 되는 부분은 없으나, …??

(지난 20년 동안의 전통적인 PHP 개발 관행에 위배되는) cloud native PHP application를 설계할 때 중요한 4가지를 지적하고 싶다고 합니다.

  1. 로컬 파일 시스템에서 멀어져야 합니다
  2. 세션 정보를 Redis에 저장해야 합니다
  3. 설정 파일을 환경 변수로 대체해야 합니다
  4. built-in 인스톨러나 updater를 사용하면 안됩니다

두번째 항목에서는 꼭 Redis만을 써야 한다는 말은 아니고 세션서버를 분리해야 한다는 의미입니다.

PHP 앱을 컨테이너화하는 방법에서는 Nginx + PHP-FPM 조합보다 Apache 웹 서버와 mod_php를 추천하고 있습니다. Nginx가 정적 리소스를 제공하는데 훨씬 유리한 면이 있지만 PHP 앱은 보통 API 서버로 동작하며 정적 리소스는 CDN을 통해 제공하므로, 관리 측면에서 Apache + mod_php가 유리하다는 의견입니다.

I wrote a PHPStorm plugin

https://dev.to/kristijankanalas/i-wrote-a-phpstorm-plugin-1job

How to create a PhpStorm plugin that adds more code generation capabilities.

PhpStorm plugin을 제작한 경험입니다. 자랑스러운 코드는 아니라고 합니다. :)

How we completed thousands of missing @var annotations in a day

https://www.tomasvotruba.cz/blog/2019/07/29/how-we-completed-thousands-of-missing-var-annotations-in-a-day/

@var에 의존하는 PHPStan의 정적 분석을 사용하기 위해, 하루 안에, 코드를 수동으로 변경하지 않고 @var annotation을 추가한 과정을 설명합니다.

Accessing private properties without Reflection

https://twitter.com/mindplaydk/status/1158995315124559872

Reflection 없이 private property를 읽는 방법입니다.

function inspect($object, $property) {
return (function () use ($property) {
return $this->$property;
})->call($object);
}

오래된 트릭을 훌륭하게 응용했네요.

PHP 버전 별 실행 결과(https://3v4l.org/lqZBd )를 보시면 PHP 7.0 이상에서만 가능한 것으로 보입니다.

🔈 Podcasts

🔈 PHP Internals News #20

  • With Nikita Popov about improvements to test PHP on many more platforms and in many more configurations.

🔈 PHP Internals News #21

  • With Will Hudgins about his “Add str_starts_with(), str_ends_with() and related functions” RFC.

🔈 PHP Internals News #22

  • With Matteo Beccati about his RFC “Escape PDO “?” parameter placeholder”.

🔈 That Podcast Episode 63

  • With Benjamin Eberlei about Tideways.

Php_annotated_monthly 이미지

JetBrains에서 제공하는 월간 PHP Annotated Monthly 2019년 7월호입니다.

이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.


News & Releases

PHP 7.3.7

나왔습니다.

PHP 7.2.20

나왔고요.

PHP 7.4.0 alpha 3

마지막 알파 버전이 나왔습니다. UPGRADING 문서를 보시면 모든 새로운 feature 목록을 보실 수 있습니다.

What’s new in PHP 7.4, What’s New in PHP 7.4 (Features, Deprecations, Speed) 등에서 더 많은 정보를 확인하세요.

PHP 7.4에서 성능을 꽤 향상 시켰음에도 불구하고, PHP 8이야 말로 PHP의 성능 향상을 이루는 진정한 이정표가 될 것이라고 합니다. JIT이 포함되었기 때문이죠.

7월 22일에 기능 확정이 되므로 아래 투표 중인 기능만이 더 추가될 가능성이 있습니다(..라고 쓰여있지만 제가 번역하는 날짜가 22일이라서 이미 투표는 끝나고 마지막 하나만 빼고 통과됐습니다).

RFC는 없지만 흥미로운 변화가 추가되기도 했습니다.

  • proc_open이 이제 shell을 띄우지 않고도 프로그램을 실행시킬 수 있습니다. Nikita Popov의 트윗과 반응을 확인하세요.
  • 이상한 배열 표현식을 쓰면 이제 notice를 던질 것이니 주의하세요.
$null = null;
var_dump($null[0]); // NULL

$int = 42;
var_dump($int['foo']); // NULL

var_dump(true[0] === false[0]); // true

PHP Internals

[RFC] Normalize arrays’ “auto-increment” value on copy on write

https://wiki.php.net/rfc/normalize-array-auto-increment-on-copy-on-write

배열을 복사해도 자동 증가하는 키를 원본과 동일하게 맞추자는 RFC입니다. 저는 여지껏 이런 것도 몰랐고…

$array = [0, 1, 2, 3];
unset($array[3], $array[2]);
$arrayCopy = $array;
$arrayCopy[] = 2;

// If the proposal is accepted, the following statement will be true.
// Currently, the arrays below are not equivalent.
assert($arrayCopy === [0, 1, 2]);

[RFC] Strict operators directive

[RFC] Strict operators directive

PHP는 대부분의 연산에서 알아서 형 변환을 해주는데요. 비교할 두 값의 형이 맞지 않거나 연산자에 맞지 않는 형일 때 TypeError를 던지도록 하는 RFC가 나왔습니다. RFC 대로라면 declare(strict_operators=1); 처럼 사용하면 됩니다.

그런데 PHP 7.4에서는 너무 많은 변화가 발생할 수 있어서 PHP 8에나 넣을지 고려한다고 합니다.

Strict operators directive img

Numeric Literal Separator.

  • PHP Internals News #17: With Theodore Brown and Bishop Bettini

https://phpinternals.news/17

숫자 리터럴에 자릿수를 표현하는 언더바(_)를 넣자는 RFC입니다.

$threshold = 1_000_000_000;  // a billion!
$testValue = ‪107_925_284.88; // scale is hundreds of millions
$discount = 135_00; // $135, stored as cents

개인적으로 마음에는 안들지만…PHP 7.4에 이미 구현되었습니다.

Strict Operator Directive.

  • PHP Internals News #18: With Arnold Daniels

https://phpinternals.news/18

위에서 언급한 Strict Operator Directive에 관해 이야기 합니다.

tools

자세한 내용은 원문 블로그를 통해 확인하세요.

  • cycle/orm

    • A powerful ORM designed specifically for long-running PHP apps. Full documentation is ready, with an example of dynamic schema and relations.
  • SerafimArts/pipe

    • An object-oriented pipe operator implementation for function call chains.
  • helhum/dotenv-connector

    • A Composer plugin that makes values from a .env file available as environment variables.
  • thephpleague/commonmark

    • A markdown parser. Overview of the 1.0 release.
  • sebastianfeldmann/phpbu

    • A database and file backups utility that can encrypt and send backups to cloud storages.
  • localheinz/http-method

    • A constants for HTTP request methods.
  • leocarmo/circuit-breaker-php

    • A Circuit Breaker pattern implementation for PHP. As an alternative also see ackintosh/ganesha.

Symfony

자세한 내용은 원문 블로그를 통해 확인하세요.

  • Symfony Local Web Server, 6 months later

  • New Symfony Core Team Member: Yonel Ceruto.

  • Improvements for Twig: Better White Space Control, Simpler Macros, Filter, Map and Reduce Features.

  • Efficient testing with fixtures on Symfony 4

  • Migrating Symfony Project to Kubernetes

Laravel

  • 자세한 내용은 원문 블로그를 통해 확인하세요.

  • Improving assertions on Laravel fakes

  • A dive into Laravel’s TestCase to decrease the Kernel boot time by ~50% during a test suite run.

  • 🎥 Laravel Core Adventures - Accessors & Mutators

  • 🔈 Taylor’s Laravel Snippet #14 podcast - Laravel Live UK, whereHasMorph, laravel/ui, front-end authorization, performance, and Lumen.

  • 🎥 Event Sourcing with Laravel and EventSauce

Async PHP

자세한 내용은 원문 블로그를 통해 확인하세요.

  • ReactPHP 1.0 LTS

    • It’s 7 years since the first ReactPHP v0.1.0 release. Now the team has announced releases of 1.0 versions for reactphp/dns, reactphp/cache packages, and reactphp/react meta-package. It means that all the main components in ReactPHP are now stable. The release with LTS marks that they will be supported for at least the next 2 years.
  • 🎥 Creating a RESTful API with ReactPHP: Plans and First Steps, What is a RESTful API?, Adding routes, Refactoring to controllers, Dummy endpoints, Workflow improvements

  • Using ReactPHP to run Drupal tasks

  • swoft-cloud/swoft 2.0

    • A framework based on Swoole for developing microservices, inspired by Spring Cloud. Implements PSR-7, PSR-14, PSR-15, and leverages AOP. See a short introductory post.

Security

nbs-system/snuffleupagus

https://github.com/nbs-system/snuffleupagus

runtime에 잠재적으로 위험한 코드 실행을 막아주는 extension입니다.

Abusing PHP query string parser to bypass IDS, IPS, and WAF.

https://www.secjuice.com/abusing-php-query-string-parser-bypass-ids-ips-waf/

PHP query string parser로 IDS/IPS, 어플리케이션 방화벽을 뚫는 방법을 소개합니다.

Magento 2.3.1: Unauthenticated Stored XSS to RCE.

https://blog.ripstech.com/2019/magento-rce-via-xss/

기타 읽을 만한 글

Clean Code concepts adapted for PHP.

https://github.com/jupeter/clean-code-php

Robert C. Martin의 책인 Clean Code 의 내용을 PHP 버전으로 옮겨놓은 것입니다.

Null Hell and How to Get Out of It

https://afilina.com/null-hell

생성자에 넣을 값 중에 optional한 값이 많을 때 null로 채워야 하는 상황에 관한 이야기입니다. 결론은 설계 좀 잘하자.

Stop using DateTime

https://blog.nikolaposa.in.rs/2019/07/01/stop-using-datetime/

가능하면 DateTime 대신 DateTimeImmutable을 씁시다!

$startedAt = new DateTime('2019-06-30 10:00:00');

$finishedAt = $startedAt->add(new DateInterval('PT3M'));

var_dump($startedAt->format('Y-m-d H:i:s')); //2019-06-30 10:03:00 ❌
var_dump($finishedAt->format('Y-m-d H:i:s')); //2019-06-30 10:03:00 ✅

You may not need a query bus

https://matthiasnoback.nl/2019/06/you-may-not-need-a-query-bus/

의미없는 query bus를 태우는 대신 명시적으로 의존성을 추가하자는 주장. 댓글에 반론도 계속 이어지고 있습니다.

Mutation testing - we are testing tests

https://sarvendev.com/en/2019/06/mutation-testing-we-are-testing-tests/

오류 기반(?) 테스트 프레임워크인 Infection를 소개합니다.
mutation testing에서 가장 유명하다고 합니다.

A decent PHP Wishlist

https://medium.com/@liamhammett/my-php-wishlist-dd74c9499591

누군가의 PHP 위시리스트!

Intro Guide to Dockerfile Best Practices

https://blog.docker.com/2019/07/intro-guide-to-dockerfile-best-practices/

Audio/Video

자세한 내용은 원문 블로그를 통해 확인하세요.

  • 🎥 PHP fwdays’19, Kyiv (English talks only)

  • 🎥 Dutch PHP Conference 2019, Amsterdam

  • 🎥 PHPDay 2019, Verona

  • 🎥 PHP Town Hall Episode 67 - On Zend Framework 3 and Laminas with Adam Culp.

  • 🔈 php[arch] podcast #21: Serverless PHP, Array Functions, and Data Structures.

  • 🔈 That Podcast Episode 60 - On Twig, Drupal, and Sculpin with Oliver Davies.

  • 🔈 That Podcast Episode 61 - On a new Symfony’s HTTP Client component with Nicolas Grekas.

애자일 커뮤니티에서 매월 애자일을 주제로 좋은 강연이나 워크샵이 열리고 있습니다.

제가 거기서 활동 하는 건 아니고 매달 좋은 강의 올라오나 보고 있는 정도입니다.

2019.10.18(금)에는 코엑스에서 컨퍼런스도 열립니다.

이번 달 주제는 OKR이었는데요. 작년에 아주 살짝 경험해본 바, 아주 좋은 기억은 아니었어서 갈까 말까 고민 했습니다만.
성과 관리 / 목표 측정 이런 게 눈에 밟히는 시즌이니 만큼, 그리고 OKR 전문가라고 하시니 궁금해서 판교까지 찾아갔습니다.

모 회사에서 인사팀을 이끌고 계시는데, 이런 행사에 대해선 알리고 싶지 않아 하셔서 실명은 거론하지 않기로 하고…
아무튼 발표 내용을 대충 따라가며 적어봤는데, 생각나는 대로 적어봅니다.

WARNING

경고로 시작합니다.

인재 특성에 따라 차근차근 도입해야 한다고.

갑자기 장난감 총으로 실험을 합니다. 두 명을 불러 한 사람은 눈을 가리고 총을 듭니다. 한 사람은 어디로 쏠지 가이드를 줍니다.

그렇게 2발씩 4번 쏘는데, 사수는 제자리에서 뺑뺑이 돌고 시작하며, 2번 쏠 때마다 도우미는 더 자세한 힌트를 줍니다. 결국 목표를 맞추는 모습을 보여주는, 시간이 걸리고 진부한 이벤트긴 했습니다만.. (그 장난감 총은 참 탐이 나더군요)

강사님은 초반에 사수가 어디를 쏴야 100점인지 모르는 상황에 주목합니다.

우리는 어디를 쏴야할 지도 모르면서 열심히만 일하고 있다고요. 그렇게 모르고 열심히 일하는 것이 조직에 악영향을 줄 수도 있고요.

이 시간은 성과관리를 주제로 OKR을 이야기 하지만, OKR이 무엇인지는 중요하지 않다고 했습니다. KPIMBO든 상관없고 어떤 철학으로 운영하는가가 중요하다고 했습니다.

성과 관리를 하는 이유는 리소스를 효율적으로 운용하기 위함입니다.

어떻게 해야할까요? 왜 100점이 안되는지 측정을 하고 그 갭을 채워야 하는 것입니다.

이는 인사팀에서 도입하고 전파하면 실패확률이 매우 높습니다. 전사가 함께 진행해야 하고, CEO 프로그램입니다(이후에도 여러번 강조하셨어요).

Managing

경영이란 것은 문제를 해결하는 것입니다. 문제라는 것은 이상과 현실의 차이입니다. 그 차이를 측정하고 해결하는 것이 경영이라고 합니다.

OKR이 진행되는 과정을’ 하나의 도표와 함께 설명을 해주셨는데, 정확한 그림을 찾지 못하겠네요.

그림은 크게 Planning / Doing / Checking 세 단계로 나뉩니다.

Planning

Planning에서는 Company OKR부터 시작합니다. 그러나 그 전에 선행되어야 할 것이 미션과 비전 설정이라고 하셨습니다.

어떤 것이 더 상위의 개념인지는 논란이 있지만, 이 분은 미션을 더 큰 의미로 본다고 했습니다.

미션이 존재의 목적이라면, 비전은 what을 의미하고 먼 훗날의 모습을 그리는 것입니다. (30년 후 쯤?)

그렇다면 그걸 어떻게 이룰 것인지를 전략이라고 부릅니다.

이게 Company OKR이 되고, 더 구체화 되어 그 아래 조직(LT)으로 내려가고, 여기서 Team OKR, 개인 OKR이 되어가며 점점 더 구체화됩니다.

개인은 이 OKR이 상위로부터 내려올 때까지 기다리는 것이 아니라 주도적으로 본인의 책임 하에 OKR을 설정해야 한다고 합니다.

CEO로부터 개인 OKR에 다다를 때까지 개인은 추상적이고 모호한 CEO의 OKR부터 하위로 내려오는 조금씩 구체화된 OKR을 계속 받아들이면서 반복해서 미션과 비전에 관해 이야기를 들어야 한다고 합니다.

최소 7번을 들어야 기억에 남는다고요. 구글의 경우는 이 과정이 약 3주에 걸쳐서 진행된다고 합니다.

Doing

Planning 이후 Doing의 단계에선 아래 5가지가 이루어져야 한다고 합니다.

  • Direction
  • Alignment
  • Expectation
  • Feedback
  • Coaching

이때 매우 강조하는 것이 Regular One on One입니다. 주기적으로(주 1회 등) 만나면서 체크하고 방향을 잡는데, 실제 업무에 관한 얘기는 스크럼 미팅이라던가 그런 곳에서 하고, 이 자리는 목표대로 잘 가고 있는지, 도와줄 것이 있는지, (업무와 관계 없이) 1년 후에 뭘 하고 싶은지 그런 이야기를 주로 하게 된다고 합니다.

Checking

이후 Checking 과정에서는 개인과 매니저 간 설정한 목표가 잘 이루어져 가는지 확인하고, 연간 혹은 분기별로 그걸 팀과 팀 관점에서 살펴보고, 그걸 또 모아서 최상위층까지 올라가며 목표대로 잘 가고 있는지 분석하는 과정을 거칩니다.

이 세 단계에서 평가에 관한 부분은 마지막 Checking 부분입니다. OKR의 핵심은 Planning이고, 방향을 잘 잡도록 이끄는 것입니다. 따라서 OKR은 평가 도구가 아닙니다. 그러나 평가 도구가 아니라 해서 평가 프로세스와 모순이 된다고도 할 수 없습니다. 방향을 잘 맞춰 간다면 좋은 성과를 낼 확률이 높으니까요.

OKR

Objectives는 why. 해야하는 이유와 목적을 나타냅니다. O는 상위와 하위 목표를 연결하는 기능을 가집니다.
Key Results는 What & how. 의도한 목적이 성공적으로 달성되었을 때의 결과/모습.

중요한 것은 60 ~ 70% 정도의 성공 확률이 있는 것으로 잡아야 한다는 것입니다. 얼마나 달성했는지로 평가를 해서는 안됩니다.

70% 달성했다면 그것 만으로도 잘 한 것이라 말해주어야 하고, 못한 만큼 우리가 배운 것이 있을 거라는 확신을 주어야 합니다.

이 부분에서 KPI와 현실적인 차이가 생깁니다. KPI는 ‘달성한다’는 표현을 합니다. 100%를 달성하는 것이 목표입니다.

물론 이 때문에 부담이 생깁니다. 그 부담의 원인은 패널티를 받는다는 사실이죠. 이 때문에 방어적이고 보수적으로 대응하게 되고, 80%의 일을 마치 100%인 것처럼 속여서 성과를 달성하는 것이 편합니다. 이렇게 회사는 비효율적으로 바뀌어 갑니다.

KPI가 목적지(지향점)이라면, OKR은 네이게이션이나 나침반처럼 방향을 가리키는 것입니다.

KPI의 문제는 또한 KPI에 따라 개인의 목표를 연결 시키기 어렵다는 것입니다. 예를 들어 매출 100% 성장이라는 KPI가 있다고 하면 여기에 맞춰 개인의 목표룰 설정하기 쉽지 않다고 하셨습니다.

그런데 이 부분은 제가 잘못 들은 건지 잘 이해가 안되는데, 실제 개인의 KPI 작성은 조직의 KPI를 기반으로 이보다 더 상세하게 작성하기 때문입니다. 조직의 KPI를 기반으로 하는지 안 하는지는 회사마다 다를 수 있겠지만요. 어쨌든 KPI는 달성해야할 목적을 기술해야 하기 때문에 유연하지 않고 회사 입장에선 비효율적일 수 있다는 면에서는 동감합니다

OKR의 superpowers

1. Focus & Commit to Priority

어떤 것을 할지 / 안할지 정하는 것

그리고 성공 확률 60%70%라는 것은 현재의 방식으로는 잘해봤자 60%70% 달성한다는 의미이고, 100% 달성하기 위해서는 다른 접근 방식을 생각해내야 한다는 점입니다. 그리고 그걸 혁신이라고 부릅니다. 이를 위해선 실패해도 괜찮다는 심리적 안정감이 기저에 있어야 합니다.

2. Align and Connect For Teamwork

3. Track for Accountability

Accountability와 Responsibility가 다른 점은 명시적으로 주어진 것을 너머 일을 처리하는 것입니다. 사람들이 이 개념이 너무 어렵다고 해서 누군가(이 개념을 만들어낸 사람인가…?) 예로 든 것이 햄버거 심부름입니다.

상사가 햄버거 심부름을 시켰을 때(직장내 괴롭힘 방지법 때문이라도 해선 안될 일 입니다만, 대상이 비서나 매니져 정도라고 해보죠)

Responsibility를 가진 사람은 햄버거를 문제없이 잘 사다 줍니다.

Accountability는 햄버거를 시켰으면 음료도 필요할지 생각해보고 알아서 음료와 필요한 걸 같이 주문합니다.

(여담인데, 이런 사람은 일할 때 좋은 동료겠지만…저라면 그에게 햄버거를 부탁하지 않을 겁니다. 햄버거를 부탁했으면 햄버거만…)

4. Stretch for Amazing

구글의 문샷(달을 더 잘보는 망원경 보다는 달에 가까이 가는 우주선을 만들겠다)과 10X(10%보다는 10배를 개선하겠다) 문화를 설명해주셨습니다.

OKR은 어떻게 설정해야 하는가

존 도어(John Doerr)의 Measure What Matters라는 책에 나온 미식축구구단을 예로 들어 설명했는데, 그 책에선 상위의 KR이 하위의 O가 된다고 하셨는데, 이는 완벽하지 않은 설명이라고 하셨습니다. 현실에서는 훨씬 복잡하기 때문이에요.

자신이 인사 담당자라면 직원들의 퇴사율을 낮추겠다는 것을 목표로 잡을 수 있을 것인가라는 질문을 하셨습니다.

목표란 것은 내가 어떤 행동을 했을 때 그 영향이 결과로 이어지는 것이어야 한다고 합니다.

주변 환경이나 다른 사람에 의해 성과가 올라가선 안된다고요.

OKR은 개인/조직별로 (모든 목표가 아닌) 중요한 3 ~ 5개의 우선 순위(Objectives)를 선정하고, 이에 따른 각각의 KR을 설정합니다.

이 목표들은 평가에 기계적으로 사용되어서는 안됩니다.

반드시 수치화할 필요도 없습니다.

OKR은 To-Do-List가 아닙니다.

Being Part of Winning Team : 성공하는 팀의 일원이 되는 것이 중요하다고 합니다. 스포츠 팀에서 주전으로 활약하지 않더라도 그 팀이 꾸준히 성과를 올렸다면 그 팀에 속한 모두가 인정받아야 한다고 합니다.

Embracing Ambiguity : 모호함을 포용할 것. 애매한 것도 괜찮습니다. 정답을 이야기하기 보다는 해결책을 찾는 것이 중요하다고 합니다. It takes a village라는 말처럼 전체가 함께 움직여야 합니다.

OKR은 서두르지 말고 3년 정도는 돌려볼 것을 추천합니다. 그렇게 하기 어렵다면 시도하지 않기를 바란다고 하셨습니다.

OKR이 성공하기 위해선 기반이 되어야 할 것은

성과 관리에 관한 철학이 있어야 하고(중요)

  • Mature Management : 성숙/유능한 관리자가 필요하고
  • Flat & Open communication
  • One on One 문화 : 앞서 말한 1:1 피드백 시간
  • Feed back & Coaching
  • Sharing mechanism : 문화/정보가 어떻게 퍼져나가는가

사업 계획과 OKR은 어떻게 다른가? OKR이 잘 돌아가는 회사라면 매우 닮아 있을 것입니다.

OKR은 Top Down인가? No. Middle-up-down

인사팀이든 어디든 해보자고 남에게 추천해서 잘 되는 경우는 없다고 합니다. 비행기에서 비상시 산소마스크는 자신부터 착용하고 남을 도우라고 안내를 하는데, 이처럼 OKR도 도입하고자 하는 사람부터 먼저 적용해보는 게 좋다고 합니다.

사례

몇가지 사례도 소개해주셨습니다.

강사님의 회사에서 실제 작성한 예시로, 목표를 설정하고 현재 어떤 문제/현상이 있어서, 앞으로 어떤 일을 하겠다는 문서를 대략적으로 보여주셨습니다.

구글에서는 OKR scoreboard라는 사이트에서 목표대로 잘 가고 있는지 점수화해서 부족한 부분이 있다면 매니져/상급자가 어떤 부분을 더 도와주어야 할지 상담하는데 활용한다고 합니다.

또다른 예시로 가상의 급여 담당자가 있다고 하면, 그 사람의 목표는 무엇이 되어야 할까요?

월급을 제 때 지급한다는 목표가 될 수 없습니다. 그건 당연한 임무니까요.

월급을 주는 프로세스를 자동화해서 조직의 생산성을 높이는 것을 목표로 할 수 있겠습니다.

그 목표를 이루기 위해 자동화 솔루션 업체와 계약하고, 운영에 있서 불편한 점을 들을 수 있는 채널을 마련하는 등의 KR을 마련할 수 있습니다.

열심히 해서 이를 목표 대비 120%를 이루었다고 해보죠. 그런데 그 해 마지막에 월급을 지급하는데 문제가 있었다면 이 사람의 평가는 어떻게 되어야 할까요?

여기서 OKR이 성과도구가 될 수 없는 이유를 알 수 있습니다.

성과는 OKR과 분리해서 측정해야 합니다.

조직 목표 달성을 위해 의미있는 행동을 측정해야 합니다. 아니면 성과 달성에 기여하지 않는 왜곡된 행동이 발생합니다.(강사분이 재미있는 동영상 예시를 보여주셨으나 이에 대한 언급은 넘어가고..)

사람들은 제도에 자신의 행동을 맞춥니다. 사실 그래야 조직이 발전합니다. 중요한 건 제도입니다.

이제는 유명해진 구글의 발표에서 심리적 안정감이 가장 중요하다고 했습니다.

이 심리적 안정감이라는 것의 기반은 실력이라고 합니다. 좋은 의도만으로는 부족합니다.

미식 축구의 예를 들었는데, 수많은 전략에서 쿼터백이 공을 던질 때는 그 위치에 팀원이 가서 받을 것을 기대하고 던지며, 팀원은 쿼터백이 공을 제 위치에 전달할 것을 예상하고 죽어라 뜁니다. 조직 전체로 보면 심리적 안정감이란 것은 내가 실패한 것에 대해 문책 당하는 걸 걱정하지 않는 것 뿐 아니라 모두가 제 자리에서 성과를 낼 것을 기대하는 것도 있습니다.

그런 조직에서만 OKR이 제대로 돌아간다고 합니다.

참고

참고할 자료로 추천하신 것은,

존 도어(John Doerr)의 Measure What Matters(번역서는 OKR 전설적인 벤처투자자가 구글에 전해준 성공 방식)와

유튜브에서 검색해보면 많은 강의가 있다고 합니다.

짧은 버전으로는 TED 동영상가 있네요.

Php_annotated_monthly 이미지

JetBrains에서 제공하는 월간 PHP Annotated Monthly 6월호입니다.

이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.


News & Releases

PHP 7.4.0 alpha 1

https://www.php.net/archive/2019.php#id2019-06-13-1

PHP 7.4의 첫 알파 버전이 나왔습니다. 6개월 간의 pre-release 단계를 시작하는데, 마지막 단계인 GA는 11월 말에 예정되어 있습니다. 정식 버전은 12월일 것으로 예상합니다.

7.4에 관한 overview는 What’s new in PHP 7.4에서 보거나 Nikita Popov가 PHP Russia에서 발표한 동영상을 보셔도 좋습니다.

Doctrine Company, LLC

https://www.doctrine-project.org/2019/05/21/monetizing-open-source.html

10년 간 Doctrine을 오픈 소스로 이끌었던 팀이 재정적으로 지속 가능하게하기 위한 목적으로 회사를 설립했습니다. 이제 프로젝트를 공식적으로 후원하거나 교육 또는 컨설팅을 요청하거나 웹 세미나에 참여할 수 있습니다…만 좀 멀죠.

Bref is now backed by null, the company

https://mnapoli.fr/bref-is-backed-by-null/

Serverless PHP app을 만드는데 도움을 주는 Bref가 null이라는 회사의 지원을 받는다(is backed)고 합니다. Bref를 만든 Matthieu Napoli란 사람이 더욱 본격적으로 발전시키기 위해 회사를 만들고 이것 저것 한다는 소식.

PHP Versions Stats - 2019.1 Edition

https://blog.packagist.com/php-versions-stats-2019-1-edition/

작년 12월에도 annotated monthly를 통해 공유했던 사이트입니다. 2019년 새로운 통계가 발표되어 소개됐습니다.

Jet Brains의 결과와는 조금 다른데 비교해 보셔도 재미있습니다.

PhpStorm 2019.2 EAP

https://blog.jetbrains.com/phpstorm/2019/05/phpstorm-2019-2-early-access-program-is-open/

PhpStorm 2019.2 EAP가 발표됐다는 소식입니다.

PHP Internals

[RFC] Allow throwing exceptions from __toString()

https://wiki.php.net/rfc/tostring_exceptions

__toString() 안에서 exception을 throw할 수 있는 RFC가 만장일치로 통과됐습니다. PHP Sadness에서 하나 줄었네요!

[RFC] Nullsafe Calls

https://wiki.php.net/rfc/nullsafe_calls

$o?->mayFail1()?->mayFail2()?->mayFail3()?->mayFail4();

“nullsafe”한 새로운 연산자에 대한 제안이 올라왔습니다. 2014년에 처음 올라왔던 것이라고 합니다.

ECMAScript 쪽에서도 이미 제안이 올라와있고, Hack은 이미 구현 했다는군요.

[RFC] Alternative “use” syntax for Closures

https://wiki.php.net/rfc/alternative-closure-use-syntax

Closure 내부에서 use를 사용할 수 있게 하는 제안이 올라왔습니다.

// This is how it looks now
$closure = function (
ArgumentType $argument1,
ArgumentType $argument2,
ArgumentType $argument3,
ArgumentType $argument4
) use ($importVariable1, &$importVariable2, $importVariable3, &$importVariable4): ReturnType {
// ...
};

// This is proposed
$closure = function (
ArgumentType $argument1,
ArgumentType $argument2,
ArgumentType $argument3,
ArgumentType $argument4
): ReturnType {
use $importVariable1, &$importVariable2;
use $importVariable3, &$importVariable4;

// ...
};

PHP Internals News #13, #14

https://phpinternals.news/13
https://phpinternals.news/14

PHP Internal을 다루는 방송인 PHP Internals News의 새로운 에피소드도 소개됐습니다.

13화에서는 PHP 7.2와 7.4의 RM(Release Manager)인 Sara Goleman과 Derick Rethans, 14화에서는 Nikita Popov가 __toString() Exception에 관해 이야기 합니다.

기타 읽을 만한 글

PHP Generics Today (almost)

https://www.daveliddament.co.uk/articles/php-generics-today-almost/

PHP에서 Generic(RFC)을 지원하는 것이 어렵기 때문에 언어 레벨에서 지원하려면 몇년이 걸릴 지도 모른다면서, 기존 툴을 사용해서 Generic을 쓸 수 있는 방법을 설명합니다.

글쓴이는 이미 커뮤니티에서는 비공식적이지만 Generic을 위한 docblock의 사용이 널리 퍼져 있음을 이야기 합니다.
Phan, Psalm, PhpStorm 등의 정적 분석 툴을 비교하고 소개하고 있습니다. 나아가 third party 라이브러리를 위해서는 Stub을 생성하는 방법도 보여줍니다.

Tests and types

https://stitcher.io/blog/tests-and-types

위 Generic에 관한 글과 함께 보면 좋겠습니다. 강한 타입을 기반으로 테스트를 하는 것을 장점을 이야기 하고, 이렇게 타입을 늘려나가는 것에 관한 저자의 소신과 재미있는 세미나 영상을 소개하기도 합니다.

GitHub Actions for PHP Developers

https://stefanzweifel.io/posts/github-actions-for-php-developers/

GitHub Actions에 PHP와 관련한 세가지 Action을 붙이는 과정을 보여줍니다.

  • Run your phpunit test suite
  • Run phpinsights
  • Run php-cs-fixer

A Look At PHP’s isset()

https://medium.com/@liamhammett/a-look-at-phps-isset-df64df7158ab

isset은 함수가 아닙니다. ..로 시작해서 isset의 다양한 특징을 보여줍니다.

Don’t just float, swim with the floating point

https://jiripudil.cz/blog/dont-just-float-swim-with-the-floating-point

PHP에서 부동소수점을 다루는 방법

Global States

https://thevaluable.dev/global-variable-states/

전역의 변경 가능한 상태 값을 최대한 없애자는 이야기

How to Mock Final Classes in PHPUnit

https://www.tomasvotruba.cz/blog/2019/03/28/how-to-mock-final-classes-in-phpunit/

PHPUnit에서 Final로 선언된 클래스를 mocking 하기 (dg/bypass-finals를 사용함)

Reflecting architecture and domain in code

https://herbertograca.com/2019/06/05/reflecting-architecture-and-domain-in-code/

소프트웨어 아키텍처 이야기

https://www.tomasvotruba.cz/php-framework-trends/

Symfony가 압도적입니다. 심지어 Laravel 다운로드 수는 포함하지 않았다고 합니다.

Structuring the Docker setup for PHP Projects

https://www.pascallandau.com/blog/structuring-the-docker-setup-for-php-projects/

PHP 개발 환경으로 Docker를 구성할 때 도움이 될 것으로 보입니다. 아래와 같은 내용을 담고 있네요.

  • 폴더 구조
  • Dockerfile templates
  • 공통적으로 나타나는 문제 해결 (file permissions, runtime configuration, …)

Tools, Symfony, Laravel

나머지 부분은 특별히 번역은 안 하고 넘어 가겠습니다. 관심 있어 찾아보신 분은 댓글로 공유 부탁합니다.

Tools

  • badoo/liveprof
    • A PHP performance monitoring tool. See the introductory post and live demo.
  • remotelyliving/php-dns
    • A DNS abstraction for PHP that allows querying DNS records with different strategies.
  • BrainMaestro/composer-git-hooks
    • Easily manage git hooks in your composer config.
  • hirak/prestissimo
    • A composer plugin to download packages in parallel and increase the speed of the install.
  • ronanguilloux/IsoCodes
    • Validators for the standards from ISO, such as international finance, public administration, book industry, phone numbers, and zip codes for many countries.
  • terrylinooo/shieldon
    • Anti-scraping and online session control for your web application.
  • goldspecdigital/oooas
    • This allows you to build OpenAPI spec using PHP classes, and then export the spec to JSON.

Symfony

Laravel

Security

Php_annotated_monthly 이미지

JetBrains에서 제공하는 월간 PHP Annotated Monthly 5월호입니다.

이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.


News & Releases

PHP

WordPress 5.2 “Jaco”

https://wordpress.org/news/2019/05/jaco/

2013년 10월 24일에 릴리즈 된 WordPress 3.7부터 보안 수정 사항을 자동으로 업데이트 하는 기능이 도입되었는데, 이게 오히려 공격 대상이 되어 가짜 자동 업데이트를 심을 수 있는 위험이 있었다고 합니다. 5.2 버전인 “Jaco”부터는 이를 보완했다는 말인데,

Before WordPress 5.2, if you wanted to infect every WordPress site on the Internet (approximately 33.8% of websites as of this writing), you just had to hack their update server

5.2 이전의 WordPress 웹사이트(전체 인터넷의 33.8%에 해당하는)에는 업데이트 서버만 공격하면 된다고 하는 걸 보니, 해커 여러분들은 5.2 버전이 보급되기 전에 털어야 합니다.

Codeception 3.0

https://codeception.com/04-24-2019/codeception-3.0

Improved interactive shell, retry steps, PHPUnit 8 support, and other things.

Zend Framework transitions to Linux Foundation

https://framework.zend.com/blog/2019-04-17-announcing-laminas.html

Zend Framework이 리눅스 재단 아래로 들어가면서 Laminas라는 이름으로 바뀌었다고 합니다. 이 새로운 조직에서 Zend Framework은 물론 Expressive microframework, Apigility 같은 프로젝트를 다루게 된다고 합니다. Repo에는 아직 별 내용은 없지만 몇 달 안으로 전체 전환이 이뤄질 것으로 보입니다.

PHP Internals

[RFC] Arrow Functions 2.0

https://wiki.php.net/rfc/arrow_functions_v2#vote

새로운 화살표 함수에 대한 스펙이 드디어 accepted 됐고, PHP 7.4부터 반영될 것으로 보입니다. fn 키워드를 사용하게 되고, 자동 바인딩 됩니다!!

$y = 1;
$fn = fn($x) => $x + $y;

JavaScript와의 사용법은 약간 다르기 때문에 문법을 확실히 익히고 써야할 것입니다.

2015년 Short Closures, 2016년 Arrow Functions까지 많은 논쟁이 있었는데요. 그 동안 왜 통과가 안됐는지에 관해선 reddit에 올라온 글을 참고하셔도 되겠습니다.

[RFC] Deprecate PHP Short open tags

https://wiki.php.net/rfc/deprecate_php_short_tags

드디어 <? 태그가 없어지기로 되어 있지만(7.4에서 default OFF, 8.0에서 제거) 여전히 반발이 심하다는군요.

[RFC] Spread Operator in Array Expression

https://wiki.php.net/rfc/spread_operator_for_array

거의 만장일치(43:1)로 통과된 스펙입니다. PHP 7.4부터는 Array에서도 spread 문법을 쓸 수 있어요.

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

Iterator를 array로 변환하는 용도로도 사용됩니다.

$array = [...$iter];

[RFC] Allow throwing exceptions from __toString()

https://wiki.php.net/rfc/tostring_exceptions

Nikita가 “PHP Sadnesses”에 있는 문제를 하나 하나 해결해 나가고 있다고 합니다. PHP 7.4를 목표로 하는 RFC이고 투표가 통과되면 __toString()에서도 exception을 던질 수 있습니다.

[RFC] Deprecate left-associative ternary operator

https://wiki.php.net/rfc/ternary_associativity

타 언어와 다르게 동작하는 PHP의 삼항연산자를 개선하고자 중첩된 삼항연산을 deprecated 처리한다는 내용입니다. 이제는(target은 PHP 7.4 혹은 8.0) 중첩된 삼항연산에 명시적으로 괄호를 넣어야 합니다.

1 ? 2 : 3 ? 4 : 5;   // deprecated
(1 ? 2 : 3) ? 4 : 5; // ok
1 ? 2 : (3 ? 4 : 5); // ok

New in PHP 7.4.

https://stitcher.io/blog/new-in-php-74

Accepted 된 RFC를 기준으로 PHP 7.4에는 뭐가 달라지는지 정리한 글입니다. PHP 7.4는 2019년 12월 릴리즈 예정입니다.

  • Short closures for cleaner one-liner functions
  • Preloading to improve performance
  • Typed properties in classes
  • Custom object serialization adds a new way of (de)serializing objects
  • Improved type variance
  • The Null coalescing assignment operator as a shorthand
  • FFI opens up new opportunities for extension development in PHP
  • Short open tags are deprecated
  • Spread operator in arrays
  • And more

어떤 변화가 가장 마음에 드시나요? 저는 Preloading에 거는 기대가 큽니다.

Derick Rethans has recorded a whole load of new episodes of PHP Internals News:

https://phpinternals.news/

PHP Internals에 관한 팟캐스트(?)가 있습니다.

🔈 #6 — On PHP and extensions quality with Remi Collet.
🔈 #7 — On JIT in PHP 8 and earlier attempts with Zeev Suraski.
🔈 #8 — On Short tags with George Banyard.
🔈 #9 — On bundled extensions with Kalle Nielsen.

Tools

Tools 항목은 번역 생략합니다.

기타 읽을 만한 글

A PHP Compiler, aka The FFI Rabbit Hole

https://blog.ircmaxell.com/2019/04/compilers-ffi.html

PHP Annotated Monthly 3월호에도 소개됐던 ircmaxell/php-compiler를 만들고 있는 Anthony Ferrara의 글입니다.

찬찬히 읽어보고 소개해드리려고 보니 엄청난 양이라서 목차나 소개하고 넘어가겠습니다.

  1. JIT? AOT? VM? What The Heck?
    1.1. Types of Compilers
    1.2. Some more definitions
  2. A bit of (relevant) history
  3. Enter PHP 7.4 and FFI
    3.1. FFIMe
    3.2. PHP-CParser
    3.3. PHP-Compiler
    3.4. PHP-Compiler-Toolkit
    3.5. PHP-LLVM
    3.6. PHP-ELF-SymbolResolver
  4. The case for macros
  5. How do I run any of this?
    5.1. Running FFIMe:
    5.2. Running PHP-Compiler Natively
    5.3. Running PHP-Compiler With Docker
  6. What’s Next

PSR-14: The series

한달 전 쯤 PSR-14 Event Dispatcher가 accept 됐는데요. Larry Garfield란 사람이 이 새로운 스펙의 다양한 관점을 시리즈로 풀어냈습니다.

How we migrated 54,357 lines of code from Nette to Symfony

https://pehapkari.cz/blog/2019/04/20/how-we-migrated-54-357-lines-of-code-nette-to-symfony-in-2-people-under-80-hours/

Nette Framework으로 만들어진 54,357 라인의 코드를 Symfony 기반으로 마이그레이션하는데 둘이서 각각 40시간 정도의 시간을 썼다고 합니다.

2017년에도 시도하려다 못했는데, 2019년에는 세가지 툴이 있어서 가능했답니다.

Rector라는 툴은 이 글을 쓴 Tomáš Votruba라는 사람이 만들었는데, PHP 5.3부터 PHP 5.6까지의 코드를 PHP 7.4 버전으로 마이그레이션/리팩토링 해주고, Symfony는 2.8에서 4.2, Laravel은 static code를 생성자 인젝션으로 패턴을 바꿔줍니다. 이외에 각자 원하는 방식으로 규칙을 추가할 수 있다고 하네요.

이외에는 NEON(Nette Framework에서 쓰는 듯) 문법을 YAML로, 하나는 Latte files to TWIG syntax 문법 변환을 해주는 툴입니다.

툴이 많은 걸 해주지만 20%는 수작업으로 해야만 했다고 합니다.

Running tests for PHPUnit from within PhpStorm

https://localheinz.com/blog/2019/04/27/running-tests-for-phpunit-itself-from-within-phpstorm/

다들 테스트 잘 만들고 계시죠? PhpStorm에서 PHPUnit을 설정하는 방법을 설명합니다.

azdanov/php-interview-exercises

https://github.com/azdanov/php-interview-exercises

다들 이직 준비는 잘 하고 계시죠? PHP 코딩 인터뷰를 연습할 수 있는 repo입니다. 정답도 있지만 직접 풀어보는 게 좋겠죠?

Find Segfaults in PHP like a boss

https://jolicode.com/blog/find-segfaults-in-php-like-a-boss

종종 발생하는 segfault 문제를 파악하는 방법입니다.

Tick이란 건 파서가 low-level tickable statement를 실행할 때마다 발생하는데, 이때마다 실행할 함수를 등록할 수 있습니다.

이 블로그에선 그동안 아래와 같이 등록해서 검사했었는데,

register_tick_function(function() {
$bt = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1);
$last = reset($bt);
$info = sprintf("%s +%d\n", $last['file'], $last['line']);
file_put_contents('/tmp/segfault.txt', $info, FILE_APPEND);
// or
// file_put_contents('php://output', $info, FILE_APPEND);
});
declare(ticks=1);

그건 PHP의 버그 때문에 발생한 것이었고, PHP 7.0부터는 버그가 수정돼서 사용할 수가 없다고 합니다. declare(ticks=1)은 선언된 파일에만 적용되도록 말이죠.

그렇다고 모든 PHP 파일마다 이걸 넣기도 싫어서 생각한 방법이 PHP Stream Wrapper와 Stream Filter를 이용하는 방식이라고 합니다. 파일을 메모리에 읽어들일 때 declare(ticks=1)를 넣어줍니다.

https://www.tomasvotruba.cz/php-framework-trends/

다운로드 통계를 기반으로 PHP frameworks의 경향을 보여주는 사이트입니다.

버전별 다운로드 통계도 보실 수 있습니다.

Serverless PHP With Bref

https://www.phparch.com/2019/05/serverless-php-with-bref-part-one/

AWS Lambda에서 PHP를 실행하는 방법을 설명합니다.

AWS SAM을 활용하는 Bref라는 툴을 쓰는데요.

Bref provides the tools and documentation to easily deploy and run serverless PHP applications.

문서를 보면 Laravel, Symfony 같은 프레임웍을 올릴 수도 있습니다.

틀리지 않는 법 - 수학적 사고의 힘

조던 엘렌버그 지음 | 김명남 옮김 | 열린책들 | 2016년 04월 25일 출간

틀리지 않는 법 이미지

세상을 더 깊게, 더 올바르게, 더 의미있게 이해하는 법

작년부터 보기 시작했던 것 같은데, 엄청 두껍고 수학을 다루고 있어서 좀처럼 속도가 나지 않은 책이다. 속도가 느려서 그렇지 읽는 내내 너무 재미있어서 시간 가는 줄 몰랐다. 연 초에 스터디도 하고 볼 게 많아 시간 날 때마다 조금씩 읽다가 전주영화제 기간에 해치워서 엄청 뿌듯하기도.

많은 내용이 담겨 있지만 커버지에 적힌 것처럼 세상을 더 깊게, 더 올바르게, 더 의미있게 이해하며, 복권을 사지 않도록 제안한다. 캐시 오닐의 대량살상수학무기가 운동권의 느낌이라면, 이건 일상 생활 속의 지혜랄까. 정확하게 현상을 이해하는 노하우를 얻을 수 있다. 읽는 동안은 자극을 받아서 일상적인 고민에 대해 수학적으로 올바르게 해석했을까 의문도 들기도 하지만 결국 사람이란 무릇 제 버릇 남 못 주기에 다시 원래의 미련한 중생으로 돌아와 고통을 받게 되리. 가끔 들춰보고 내가 세상을 잘 해석하고 있을까 돌아보기 좋은 책이라 생각한다.

올해 읽은 책 중에 최고라고 손에 꼽을 만 하다. 교육적인 의미를 떠나서 작가가 이야기를 엄청 재미있게 한다. 내가 살면서 수학과는 한 대여섯명은 본 것 같은데, 말이 적은 사람이 없다. 저자는 그게 수학적으로 틀린 생각이라고 하겠지만.

테스트 주도 개발로 배우는 객체 지향 설계와 실천

스티브 프리먼 , 냇 프라이스 지음 | 이대엽 옮김 | 인사이트 | 2013년 06월 20일 출간

테스트 주도 개발로 배우는 객체 지향 설계와 실천 이미지

오래 전 S66 스터디와 올 해 회사에서 진행한 TDD 스터디 교재로 썼던 책이다. S66 스터디 때는 제대로 이해도 못했고 책을 완독하지도 못했는데, 이번에는 나름 열심히 잘 읽어냈다. 8장까지의 이론은 스터디 진행 과정이었기 때문에 여러번 주의깊게 읽었고, 중간 코드로 이해해야 하는 부분은 문법의 낯선 부분과 가독성 때문에 쉽게 진도가 나지 않아서 괴로웠다. 그러나 이후 테스트에 관한 노하우는 쉽게 쉽게 읽고 넘어갈 수 있었고, 나도 그동안 이해도가 많이 높아졌는지 전보다 이해하는 폭이 넓어졌다.

어떤 분은 이것이 ‘일반적인 TDD는 아니다’라고 하셨지만, 다 읽어본 결과 TDD나 테스트를 공부하기에는 매우 좋은 책이라고 생각한다. TDD 만을 공부한다는 건 사실 현실성이 없고, 객체지향이나 설계 관점에서 같이 이해력을 높여야 하기 때문이다. TDD를 공부하는데 이보다 더 좋았던 책이 없었을 정도다. 다만 입문용으로는 너무 어렵다.

내가 TDD를 잘 몰랐을 때나 TDD가 불가능 하다는 사람들처럼, 테스트를 만들어가는 과정에서 많은 혼란이 있다. 정석이라면 이렇게 해야하는데, 이게 구조상 가능한가? 이거 배보다 배꼽이 더 큰데? 이런 의문도 들고. 그런데 이 책에서도, TDD를 잘하는 사람도 정석으로만 테스트를 만들어 나가진 않는다. 당시 생각하는 가장 적절한 선택을 할 뿐이다. 그리고 실패도 하고, 잘못을 인정하기도, 설계를 뒤엎기도 한다. 초보에게 힘든 것이 이 지점인데, 내가 몰라서 TDD가 어려운 건지, 원래 쉽지 않은 테스트인 건지 구분이 어렵다.

그런 면에서 TDD가 현실적이지 않다는 사람들이 이해되기도 했다. 설계 역량이 없다거나 TDD에 관한 충분한 지식이 없는 상황에선 잘못된 선택이 지속될 가능성도 크다고 생각한다. 물론 이건 코딩도 마찬가지겠다만. 라이브러리 익히는 것처럼 튜토리얼 한두번 따라해서 잘 되지도 않고, 정답도 없고, 잘 선택하는 안목을 기를 수 밖에.

지금보다 더 설계나 테스트에 관한 역량이 늘어났을 때 또 다시 훑어보면 좋을 책이라고 생각한다.

연재




책을 읽기 전에 참고할 것

이해 안되는 문장에 대한 여러 의견

  1. “테스트를 작성하는 동안에는 테스트가 실행되거나 심지어 컴파일되지 않으리라는 사실을 무시하고 테스트 내용에만 집중한다. 즉, 보조적인 역할을 하는 코드로 이미 존재하는 테스트를 실행할 수 있다고 간주한다”
  • 원문은 we act as if the supporting code to let us run the test already exists
  • 구글 번역하면, 우리가 테스트를 실행하게하는 지원 코드가 이미 존재하는 것처럼 행동합니다.
  • 번역하실 때 잘못 띄어 읽으신 것 같음
  1. “캡슐화와 정보은닉이 직교적인 설계 품질을 가리킨다”
  • 번역자의 글
    • 원문은 이렇습니다.
    • “The terms are often used interchangeably but actually refer to two separate, and largely orthogonal, qualities.”
    • 우선 두 용어 ‘캡슐화’와 ‘정보은닉’이 설계의 품질을 나타내는 별개의 개념이라고 생각하시면 됩니다. 그리고 여기서 직교적이라는 표현은 캡슐화와 정보은닉이 서로 독립적인 설계 품질이라는 의미입니다.
  • 참고 : https://justhackem.wordpress.com/2017/02/28/encapsulation-and-information-hiding/
  1. 66페이지 하단,
    “이처럼 ‘가족 같은’ 접근법에서는 각 객체는 자기 역할을 수행하는 데 필요한 만큼 정보를 전달받고 그러한 역할 표현과 부합하는 추상화에 포함된다.”
  • 번역자의 글
    • 원문은 paternalistic이고, 원래는 ‘가족주의적인’으로 번역했었는데, ‘가부장적인’이라는 의미로도 사용되는 표현입니다. 교정/편집 과정을 거치면서 ‘가족 같은’으로 바뀌어서 조금 이해하기 어려워진 것 같네요.
  1. 17페이지 중간,
    “시스템을 그것이 지닌 역학 측면에서 생각해보면,”에서 시스템이 지닌 역학 측면에서 생각한다는 의미
  • 번역자의 글
    • 원문은 이렇습니다. “Thinking of a system in terms of its dynamic, communication structure is a significant mental shift from the static classification that most of us learn when being introduced to objects.” 번역서의 ‘역학’은 이 문장의 dynamic을 옮긴 것인데요, 역학은 국어사전에 “부분을 이루는 요소가 서로 의존적 관계를 가지고 서로 제약하는 현상”이라고 정의돼 있습니다. 따라서 책에서는 시스템을 구성하는 요소들의 관계가 만들어내는 현상으로 이해하시면 될 것 같습니다.
  • 또 다른 어떤 분의 의견
    • 우선 2.3절에 도메인이란 얘기가 나오는데 어느 논문에서의 정의를 빌리면( http://www.springer.com/.../cda.../9783642366536-p1.pdf…) domain is an area of knowledge that uses common concepts for describing phe-
      nomena, requirements, problems, capabilities, and solutions. 이렇다고 합니다. 그리고 도메인 모델이란게 특정 개념과 행동,의사소통 패턴 등을 공유하는 복잡한 지식의 조각들 간에 관계성을 부여해서 추상화시킨 것이라고 본다면 결국 의사소통 패턴에 속한다는 말과 통하는 부분이 있는것 같고요.
    • 그럼 시스템을 역학측면에서 본다는 것을 시스템을 정적인 상태가 아닌 동적인 상태(도메인에 속한 객체나 엑터들이 서로 상호작용 하고 있는 상태)로 보는것이라고 해석해 본다면 동적인 측면에서 보여지는 의사소통 구조는 정적인 측면에서 볼때와 상당히 다르고 더 고차원 적이다라는 의미로 느껴집니다.
    • 다음장에 나오는 게임엔진 예시에서 엔진의 관점과 담당객체의 관점이 믹스될때 상당히 복잡해 보이는 면이 있는데 이것을 앞에서 얘기한 시스템의 정적인 측면과 동적인 측면, 그리고 더 상위의 도메인 모델링으로서 접근으로 나누어 바라보게 되면 시스템의 상태와 관계가 더 명확해 진다는 의미로 어설프게나마 해석이 되는것 같습니다.

그래도 이해 안되는 문장이 있다면

어려운 책이라 번역하신 분도 고생 많으셨을 것 같다. 원래 어떤 의미로 쓰였는지 확인하는 것이 더 이해 잘되는 경우가 종종 있는데, 구글에서 책의 원제와 함께 확실하다고 생각이 되는 단어 몇개를 같이 검색해보면 books.google.co.kr 사이트의 링크를 찾을 수 있다. 이번에도 교재 본문에 나온 “중첩된 피드백 고리”나 이해 안되는 문장 몇가지가 뭘 의미하는지 궁금해서 책 제목(growing object-oriented software guided by tests)와 몇개의 단어를 조합해서 원문을 찾을 수 있었다. 예를 들어, “growing object-oriented software guided by tests nested loop system”라고 검색하면 검색 결과 내에서 이런 링크를 찾을 수 있다. 언제까지 이런 꼼수가 통할 지는 모르겠지만.

발표 자료

“테스트 주도 개발로 배우는 객체 지향 설계와 실천 책”의 서문, 1장, 2장까지의 발표는 내가 했다.

참고 자료

이후 8장까지의 발표자료는 내 것이 아니라서 공유할 수 없지만, 이 과정에서 멤버들과 나누었던 이야기가 참 좋았다. 그것도 공유할 수 없는 것이 아쉽긴 한데, 그 이야기 속에서 언급된 링크라도 남긴다.

  1. 채수원님이 공개하신 “TDD 실천법과 도구”
  • 각 장별로 추가 코멘트를 달아 놓으셨는데, 이 책이나 PDF를 읽으실 때 참고하면 좋다
  1. TypeWars

  2. 위 글에 처음에 나오는 cleancoders 강의를 보고 백명석님이 올린 강의

  1. Testing, Oh my! by Jin-Wook Chung

  2. OKKYCON 2018 정리

  3. 마틴 파울러의 UnitTest를 번역한 글

  4. TDD에서 외부 자원은 격리 대상이어야 하는가

  1. DHH의 TDD is dead. Long live testing. 논란
  1. 객체지향 생활 체조 총정리

  2. DD는 설계 방법론이 아니다

  3. TDD 변절자: TDD는 설계 기법이 아니다

  4. 서비스를 성공적으로 만드는 방법

  5. 협업 SW개발 플랫폼 Yobi 발표

  6. static 메서드 의존을 제거하고 테스트하는 방법

  1. 객체 지향 프로그래밍 입문 - 최범균

  2. AAA vs GWT

  3. 교재를 읽기 위한 정도의 문법은 이 영상을 추천합니다(2시간)

  • Java 문법이 생각이 안난다고 하니 주원님이 추천해주신 영상
  1. 코드스피츠
  • 1회차
    • 객체와 값객체, 단일 책임의 원칙
  • 2회차(1/3)
    • 프로시저의 특징, 변화율을 다루는 방식, 레이어링
  • 4회차
    • 역할과 책임
  1. ATDD

  2. CRC 카드

  3. LoD(Law of Demeter)의 핵심

  • LoD는 O.m() 메서드는 아래 열거한 다섯 가지보다 더 많은 내용을 알아서는 안된다고 가이드합니다.
    • O 자신
    • m의 파라미터
    • m에서 생성된 객체
    • O가 필드로 가진 객체
    • O.m() 스코프에서 접근할 수 있는 전역 변수
  1. 인수테스트, 단위테스트, 통합테스트, 전 구간 테스트

  2. 스터디 모임 방법 몇가지 - 김창준

  3. private method 테스트

  1. postman을 활용한 자동화 테스트
  1. 생각하라, 객체지향처럼

  2. RailsConf 09: Robert Martin, “What Killed Smalltalk Could Kill Ruby, Too”

  3. ports & adapter 패턴

다음 단계는

기초와 이론 부분에 8주를 써버렸기 때문에 앞으로 책을 다 마치려면 한 3달 ~ 4달은 더 해야 끝날 것 같다는 생각이 들었다. 3달을 넘어가는 건 너무 지치는 일이라서 스터디는 일단 멈추기로 했다. 이후는 각자 책을 읽기로 하고 2주 마다 만나서 각자의 업무에서 도입하거나 공부하는 것을 공유하기로 했다.

나는 책을 더 읽기로 결정했는데, 갑자기 바빠져서 책을 전혀 못봤다. 이럴 줄 알았지!

9장부터 코드가 나오기 시작하는데, 역시 쉽지는 않다. 이 블로그 연재도 책을 다 떼면 이어서 쓸텐데…

과연 할 수 있으려나?

0%