최근에 농협사건으로 인해서 리눅스(유닉스) 명령어인 rm인 유명해졌다. 현재 언론이나 정부는 누군가에 의한 악의적인 공격으로 보인다고 하고 있다.
공격치고는 너무 단순한 명령어라 당황스럽지만, 완전 소설 쓰는 느낌도....
특히 이 시점에 북한을 의심하는 정부는 또 뭔가요? 어떤 이슈만 생기면 나오는 북한, 이젠 좀 고만;;
이런 사건이 발생하고 복구하는데 시간도 오래 걸리고 여러가지 추측만 무성한 지금 이게 바로 우리 IT역량의 현주소다. 시스템관리자, 개발자를 탓할 것이 아니라 질좋고 안전한 시스템을 만들기 위해서 투자를 해야 하는 것이다. 투자를 하기 위한 의사결정자들이 전체적으로 시스템, S/W에 대한 이해도가 낮다고 밖에 생각이 안든다.
"org.springframework.dao.DataAccessResourceFailureException: Could not increment identity; nested exception is java.sql.SQLException: 트랜잭션(프로세스 ID 816)이 잠금 리소스에서 다른 프로세스와의 교착 상태가 발생하여 실행이 중지되었습니다. 트랜잭션을 다시 실행하십시오."
spring batch를 적용해서 수행하다가 보면, 위와 같은 에러를 만날 수가 있다. 말그대로 쿼리를 수행 후에 unique한 키발급이 되지 않은 상황이다. 트랜잭션이 보장되지 않도록 쿼리를 작성해서 발생하는 문제인데 MSSQL DB인 경우 간혹 발생한다.
"프로그래머의 길, 멘토에게 묻다"라는 책을 보면 엔지니어의 사고방식에 대해서 나옵니다. 소프트웨어 개발업무를 하면서 업무에 대해 스펙을 정리하고 지속적으로 개선하는 좋은 습관들이 개발 이외의 업무를 하더라도 효과적으로 업무를 수행한다는 이야기입니다. 우리 모두 소프트웨어 엔지니어로서 자부심을 가졌으면 합니다...^^
참고 서적 : http://book.naver.com/bookdb/book_detail.nhn?bid=6332442
아래 글들을 보면 구글을 비롯해서 facebook과 apple도 엔지니어 중심의 문화라는 것을 볼 수 있습니다. 특히 페이스북은 회계담당자도 엔지니어출신을 채용을 한적이 있다고 합니다.
유능한 감독은 유연성이 있다.꼭 지켜야 할 핵심이 아니라면 현장 상황에 자기 생각을 잘 맞춰 간다.그렇지 않은 감독은 반드시 자기가 생각한대로 100% 영상에 옮겨져야 한다.전자는 결과적으로 100%자기 생각을 관객에게 전달하고 후자는 그러다 지친다. - 박중훈
핵심과 유연성에 대한 이야기인데 위에 트윗은 핵심보다는 유연성에 맞추어서 표현글로 보인다. 감독역할을 하는 리더가 핵심이 아닌 것에서 집착을 하고 비용을 낭비를 한다면 배우들은 지쳐서 쓰러지게된다. 반대로 핵심이라면 어려운 상황이라도 반드시 일관성이 있게 지켜야 하고 배우들이 지치면 다독이면서 끌고 나가야 한다. 핵심을 버리고 성공하는 영화는 없을 것이다.
리더는 어떤 상황/업무에서 핵심을 잘 파악해야 한다. 본질이 무엇인지? 핵심이 무엇인지? 핵심을 통해서 만드는 가치는 무엇인지를 정의하고 구현을 해야 한다. 실제로 구현을 하면서 유연성 있게 대응하는 것은 리더의 역할이다. 핵심 이외의 것에서 이기적으로 구현을 하다가보면 리더를 따르는 이는 지쳐서 사라질 것이다.
리더를 믿고 따르는 사람들이 지치지 않도록 핵심과 핵심이 아닌 것에 대한 정의를 잘 해야 한다. 핵심이 아닌 것에 대해서는 유연성을 보이도록 하자. 그리고 리더는 항상 진심으로 마음을 전달할 수 있어야 한다.
내가 기능을 구현할 때도 컴포넌트(클래스) 간에 R&R도 애매할 때가 있다. R&R은 비즈니스 로직을 어디에 두는 가를 결정해야 하기때문에 객체지향설계 시에 매우 중요한 요소이다.
R&R은 boundary하고도 밀접하다. 이 기능에 대한 문제의 해결의 R&R은 My boundary안에 있다면 문제를 해결하는 곳에서 처리를 해야 한다. 어떤 구조적인 문제로 문제가 전파가 되는 경우라면 그 문제를 My boundry에 갇아두고 다른 곳에는 영향을 끼치기 않게 해야 한다.
그렇게 R&R과 boundary를 만들어도 애매할 때 가장 중요한 원칙은 중복제거과 I/O throttling이다. 중복없이 역할을 가질 수 있는 방법을 찾거나 중복을 최소화해야 한다. 변경에 대해서 도메인 지식으로 가장 많이 알고 부분에서 주도권을 갖는 것으로 엑세스는 권한을 한군데로 집중해서 분산되지 않아야 한다. 둘다 애매한 경우에는 새로운 R&R을 가지는 컴포넌트를 만드는 경우가 있다. 새로운 R&R을 가지는 컴포넌트는 애매한 역할을 명확하게 만들고 그 역할의 문제를 해결해야 한다.
지난 주에는 2개의 인프라성 서비스와 회의를 할 시간이 있었다.
하나의 인프라는 새로운 기능 추가에 대한 업무를 최소화하기 위해서 중복을 허용하면서 R&R을 줄이려는 얘기를 계속한다. 원칙이나 룰도 없이 "어렵다/힘들다/공수가 많이 든다/자신이 없다"만 반복한다.
또 하나의 인프라는 이미 추가된 기능일지라도 인프라성으로 가져갈 수 있는 부분을 더 제공해서 서비스에서는 서비에 충실한 비즈니스 로직에만 집중을 할 수 있게 해준다. 오히려 너무 많은 부분에서 고려를 하는 것 같아서 메인Role에 집중을 할 수 있게 의견을 주었다.
정확한 분석/설계으로 통해서 R&R을 정확하게 만들지 않고 업무량을 줄이기 위한 방법으로 방향성을 정하는 경우가 있다. 주로 꼼수라는 표현을 많이 쓰는데 꼼수는 또 다른 꼼수를 하게 되고 변경에 제약사항이 계속 늘어가게 된다. 이 부채의 비용은 시간이 흐를 수록 급속도로 높아져서 결국에는 전체 시스템에 부담을 주게 된다.
객체지향설계/개발을 통해서 얻는 배움은 올바른 객체지향시스템에 대해서 알수 있게 하고 더 나아가서는 조직업무에도 적용을 할 수 있는 사고이다. 다양한 사람과 큰 그림에 대해서 이야기를 하다가보면 코드를 작성할 때도 어떤 식으로 하는지 뻔히 보인다. 구분하고 나누는 것은 쉽지 않은 일은 맞지만 원칙에 맍게 끊임없이 좋은 방향에 대해서는 고민을 해야 한다. 이미 잘못되어있다면 개선하는 것 그게 우리가 해야할 일 아닌가?