OOP의 5가지 원칙 / 5 Principle of Object-Oriented Programming.

총 3개의 파트로 진행될 [OOP 5원칙] 세미나는

다른 언어에서의 소프트웨어개발자들이 갈고 닦은 수많은 방법론중에

가장 널리 활용되고 기본이 된다고 여겨지는 5가지 원칙을

ActionScript 3.0에 적용해보고 그에 대한 의미를 다시금 생각해보는 내용이 될 것입니다.

때문에 객체 지향, 디자인 패턴에 대해서 전혀 모르는 상태라면

본 세미나는 별로 도움이 안될지도 모르겠습니다.

디자인 패턴, 리팩터링, 객체지향이니 하는것들은

모두 경험과 필요성을 자각하고 있다는 전제를 바탕으로

기본적인 설명은 하지 않을 것입니다.



0. 서두, Prologue

Flash 는 특성상 개발 기간이 짧고 디자인과 언어로써의 역할을 모두 해왔다.

게다가 Flash가 부흥하게 된 계기 역시 Tween 을 이용한 애니메이션이 지대한 공을 하였기 때문이고

거기다가 그당시 지원되던 메소드들은

말그대로 몇몇 "기능"일 뿐이었다.

솔직히 말해서 디자인툴도 아닌것이;;

개발언어도 아닌것이;;

참 희한했던 툴로 보였을 것이다.

언어로써의 모습도 아니었거니와 돌이켜 생각해보면 참 많은 내용을 하나의 메소드로 제공했었다는 것을 알 수 있다.

그래서 Flash 의 역사는 적지 않게 흘렀지만

이제서야 ActionScript 3.0이 나타났고 비로소 객체지향이라는 언어로써의 자격이 생겼다.

물론 아직도 미흡한 부분이 많고 앞으로 나갈길이 많지만

OOP를 지향하기에는 부족함이 없다.

OOP를 향한다는 이야기는 핵심적인 기술, 특정한 알고리즘하나, 단순 노가다가 아니라

구조로써 변화에 대응할 수 있고

보다 효율적인 관계를 구현전에 미리 구상할 수 있기 때문에 비용이 줄어든다는 이야기며

프레임웍과 개발 방법론을 익힘으로써 큰 규모의 어플리케이션으로써의 면모를 갖출 수 있다는 이야기다.



그렇다면 이미 많은 시간이 지난 이 시점에서 우리가 가져야할 자세는 무엇일까?

다른 진영에서 수십년간 쌓아온 우리 선배들의 꿀물지식들을

낼름 가져와서 우리것으로 익혀 미래에 대응해야 할것이다.



1. 5원칙, 5 Principle

우리가 만드는 클래스들, 클래스들간의 관계들, 구조들...

과연 어떤게 좋은 구조라고 할 수 있을까?

어떻게하면 보다 효율적으로 관리하고, 나중에 손이 덜 가도록 만들 수 있을까?

이에 대한 질문은 다른 영역에서 수 없이 논의되었었다.

오랜 시간 논의된 결과 아래 5가지 원칙을 기준으로 하게 되었다.

 - OCP : Open-Closed Principle (개방-폐쇄의 원칙)
 - SRP : Single-Responsibility Principle (단일 책임의 원칙)
 - DIP : Dependency Inversion Principle (의존 역전의 원칙)
 - ISP : Interface Segregation Principle (인터페이스 분리의 원칙)
 - LSP : Liskov Substitution Principle (리스코프의 대체 원칙)

딱 보기에는 약자도 거기서 거기고 영어로 보자니 먼말인지 모르겠고

한글로 읽어도 글자만 한글이지 당췌 이해가 잘 가지 않을 것이다.

어디서 본거 같긴 한데 정확하게는 무슨 말인지 잘 모르겠고

무슨 내용인지 궁금해서 살살 입질이 오리라 믿는다.

위 5가지 원칙을 기준으로 앞으로 설명을 해 나갈텐데

저 5가지 원칙은 서로 다른 뜻이나 관계가 아니라

서로 연관이 되어 있고 반대되는 원리 같은데 같이 쓰이기도 하는

서로 밀접한 관계가 있는 원칙들이기 때문에

세미나를 진행하면서 순서 없이 하나씩 등장할것이다.


2. OCP ( Open-Closed Principle ) : 개방-폐쇄의 원칙

사전적인 뜻풀이로는

"상속에는 열려있어야 하고 변경에는 닫혀있어야한다."

라고 되어 있다.

무슨 뜻인고 하니 우선 예를 들기전에 간단하게 개념부터 이야기 하고 가자면

상속을 자유롭게 하기 위해서 특정 하위 클래스가 할일을 미리 상위 클래스에서

구현해버리면 그 기능을 하지 않아야할 클래스까지도 그 기능을 강제로 물려받는다는 이야기다.

변경에 닫혀야한다는 이야기는

상위클래스는 모든 하위클래스들이 공통적으로 쓰는 기능들을 가지고 있기 때문에

특정 하위 클래스라고 해서 상위 클래스의 기본 기능을 바꿀수 있거나 간섭할 수 있어서는 안된다라는 이야기다.

결국은 OOP의 기본 개념인 자유로운 상속을 통한 확장과 재사용성을 추구하기위한

제 1법칙인 것이다.

자 그러면 널린 Java 예제 말고 ActionScript 로 그 예를 한번 살펴보자.

package painter1
{
     import flash.display.Sprite;
    
     public class Shape extends Sprite
     {
          protected var _type: String;
               
          public function drawCircle(): void
          {
          }
               
          public function drawOval(): void
          {
          }
               
          public function drawRect(): void
          {
          }
               
          public function drawTriangle(): void
          {
          }
               
          public function get type(): String
          {
               return this._type;
          }
         
     }}//end Shape

}

위와 같은 Shape 클래스가 있다.

이 클래스는 원, 사각형, 타원, 삼각형을 그릴 수 있는 모든 메소드를 가지고 있다.

그중에 하나로 Circle 클래스를 살펴보자.

package painter1
{
     public class Circle extends Shape
     {
          public function Circle()
          {
               this._type = "circle";
          }
     }}//end Circle

}

Circle 클래스는 자신의 타입을 "circle" 로 지정하고 Shape 클래스를 상속하였다.

그럼 사용할때는 어떻게 사용하는지 보자.

package painter1
{
     import flash.display.Sprite;
    
     public class Painter extends Sprite
     {
          public function Painter()
          {
               // set shape to Circle.
               this.shape = new Circle();
          }
         
          private var shape: Shape;
    
          public function draw(): void
          {
               if( this.shape.type == "circle" )
               {
                    this.shape.drawCircle();
               }
          }

     }}//end Painter

}

Painter 클래스에서는 사용될 shape 클래스중 하나를 인스턴스화해서

draw 라는 메소드에서 사용할때

type 이라는 변수를 가져다가 체크하는 수 밖에 없다.

클래스 다이어그램으로 그려보면 다음과 같다.

사용자 삽입 이미지


그러면 직사각형, 별모양, 오각형, 마름모, ................

늘어날때마다 타입은 하나씩 늘어나고

메소드도 하나씩 계속 늘어나야된다.

이런 문제를 어떻게 해결 할 수 있을까?

다른 언어에서는 Abstract 메소드를 이용해서 구현하지만 Flash 에서는 지원되지 않는 만큼

인터페이스를 통하여 추상화하는 방법을 사용한다.

또 슬슬 용어가 어려워지는데

아래 결과를 먼저 보자.

package painter2
{
     import flash.display.Sprite;
    
     public class Painter extends Sprite
     {
          private var shape1: IShape;
          private var shape2: IShape;
          private var shape3: IShape;
         
          public function Painter()
          {
               this.shape1 = new Circle();
               this.shape2 = new Rect();
               this.shape3 = new Triangle();
          }
         
          public function draw(): void
          {
               this.shape1.draw();
               this.shape2.draw();
               this.shape3.draw();
          }

     }}//end Painter

}

어떤 쉐입이 오던지 IShape 을 구현한 클래스이면

draw() 메소드만 실행해주면 된다.

아래는 IShape 인터페이스의 모습이다.

package painter2
{
     public interface IShape
     {
          function draw(): void;

     }}//end IShape

}

draw() 메소드 밖에 없다.

즉, IShape 을 구현한 클래스는 모두 draw 라는 공통적인 메소드를 가지지만

어떤 동작을 할지는 구현된 클래스가 알아서 처리하는것이다.

interface 는 OCP 를 위해서 태어난게 아닐까 싶다.

즉 Oval은 public 으로 draw 메소드를 구현해놓고

그 안에서 원을 그릴지 어떨지 판단하면 된다.

Oval클래스는 아래와 같다.

package painter2
{
     import flash.display.Sprite;
    
     public class Oval extends Sprite implements IShape
     {
          public function draw(): void
          {
               // draw oval
          }

     }}//end Oval

}

훨씬 간결해졌으면서도 훨씬 사용하기 편해졌다.

이와 같이 상위 클래스가 하위 클래스의 역할을 벗어던짐으로써

상위 클래스 대신 인터페이스가 그자리를 차지하면서 생긴 효과는

재사용성을 극대화 시키고 IShape 을 사용하는 곳이면

그 후에 어떤 도형을 추가하더라도 사용되는 곳의 소스는 수정할 필요없이

얼마든지 추가할 수 있게 되었다.

위 구조를 클래스 다이어그램으로 나타내면 아래와 같다.

사용자 삽입 이미지


이처럼 확장이 열려있도록 하기 위해서는

인터페이스를 통하여 어떤 동작을 할것이라는 것만 정의를 해주고

실제 동작하는 것은 하위클래스가 담당하도록 확장을 자유롭게 해줄 수 있다.

이런 구조가 바로 확장에 있어서 열린 (Open) 된 구조다.

이렇게 됨으로써 상속을 하면서 상위 클래스를 변경하지 않아도 되게 되었다.

이것이 변경으로 부터 닫혀 (Closed) 된 구조다.

ActionScript 기본 클래스중에서

예를 볼 수 있는 부분은 바로 ByteArray 와 URLStream, Socket, FileStream 클래스들이다.

기본적으로 생각할 수 있기로는

어차피 바이트를 읽고 쓰는 클래스들인데

ByteArray 를 상위 클래스로 놓고 쓰지 않을까?

라는 생각이 들수도 있지만

바이트를 읽고 쓰는 동작이 ByteArray 에 의해서 고정되어 버렸다면

바이트 정보를 메모리가 아닌 로컬 파일을 쓰는 FileStream,

바이트 정보를 메모리나 로컬 파일이 아닌 패킷으로 보내는 Socket 등의 클래스들은

탄생하지 못했을 것이다.

탄생했더라도 ByteArray 와는 상관없는 상위 클래스를 가지고 있을것이기 때문에

바이너리 데이타를 소켓으로 보내거나

바이너리 데이타를 파일로 저장하는등의 방법은 아마 매우 어려워졌을 것이다.

하지만 IDataInput, IDataOutput 이라는 인터페이스 둘로 분리시킴으로써

바이트 정보를 읽고 쓰는 행위를 한다는

동작만 정의해두고

실제로 동작하는 부분은 이 인터페이스를 구현하는 클래스들이

따로따로 구현할 수 있게 된것이다.

'Architecture > OOP 5대 원칙' 카테고리의 다른 글

[AS3.0 강좌] OOP의 5대 원칙 Part.3  (20) 2007.12.11
[AS3.0 강좌] OOP의 5대 원칙 Part.2  (4) 2007.12.11

일단 한마디를 하고 넘어가겠습니다.

저는 보안에 대해서 그다지 지식을 많이 가지고 있지 않지만

ActionScript 3.0 의 보안 모델은...

"참 거지같습니다."

일관성이라고는 눈을 씻고 찾아봐도 없고

융통성이라고는 코를 씻고 찾아봐도 없으니

강좌 마지막에 재미있는 에피소드를 하나 말씀드릴께요. ㅎㅎ



이런 어정쩡한 보안 모델에 대해서

처음에 맨땅에 3.0 공부할때 정말 애 많이 먹었습니다.

결국은 핵심적인 부분은 옆팀의 선준님께서 해결해주셔서 큰 무리는 없었지만

이렇게 저렇게 보안에 대해서 많이 걸리고 넘어져보니

어느정도 갈피가 서더군요.

참고로 플래시 보안모델이 정해놓은 개념이 아니라

제가 겪다보니 이런식으로 정리가 되더라~ 말이죠.

때문에 ActionScript 3.0 으로 외부 데이타를 사용할때 참고하면 내용을 정리한것이지

절대로 레퍼런스나 어도브가 권하는 정보가 아니니 분별력있게 받아들이시기를 발바니다.

자 본론으로 들어갑니다.



1. Information

보안 모델이 다루는 정보의 종류는 두가지 입니다.

 - 가공해야만 정보로써 가치가 있는 데이타.
 - 존재 자체로도 정보로써 가치가 있는 데이타.

jpg 나 flv 는 그 데이타 자체로는 우리가 어떤 정보인지 알 수 없습니다.

사진 프로그램이나 동영상 프로그램으로 돌려봐야지만 어떤 영상인지 알 수 있다는 이야기죠.

Flash 에서는 로드해서 클래스로써 감싸야지만 비로소 사용할 수 있습니다.

이런 가공해야만 정보로써 가치가 있는 데이타는 바이너리로 압축이 되어 있다는게 특징입니다.

하지만 Text, Variables(변수=값&변수=값 형태), XML 은 그 자체로도 정보로써 활용할 수 있습니다.

이렇게 정보는 두가지로 구분될 수 있습니다.



2. Use & Access

보안 모델이 판단하는 "정보의 사용"은 두가지로 나뉩니다.

 - 원본 자체를 그대로 사용하는 행위.
 - 원본에서 가공할 수 있는 데이타로 변환하는 행위.

자 말이 조금 헷갈리는데

원본 자체를 그대로 사용하는 경우는 말그대로

로드해서 걍 보여주는 겁니다.

이미지는 로드해서 Bitmap 한테 줘서 보여주고

FLV 는 스트림으로 감싸서 재생만 하고

MP3 도 사운드로 감싸서 재생만 하는겁니다.

원본에서 가공할 수 있는 데이타로 변환하는 행위는

이미지의 경우는 BitmapData.draw() 가 있을테고

사운드의 경우는 Sound.computeSpectrum() 이 있을겁니다.

이미지는 비트맵정보를 가져와 그것을 바탕으로 가공을 할 수 있을테지요.

사운드는 바이너리 정보를 가져와 사운드변형을 할 수 있을테지요.

이렇게 두가지 사용으로 나뉠수 있습니다.



3. Security don't allow all.

Flash 보안 모델의 기본은

"모든 보안을 일단 막고, 승인된 것만 풀어준다." 입니다.

우리가 아무조치를 취하지 않으면 기본적인 보안은 모두 막힌다 입니다.

단지 기본적인 보안에 해당되지 않는 보안에는 여러가지가 있겠죠.

localWithFile 이라던지 localTrusted 는 기본으로 모두 풀려있습니다.

이처럼 Flash 보안 모델은 "상당히 까다롭습니다."

Flash 보안 모델은 아래와 같이 보안을 나눌 수 있습니다.

 - 가공해야 정보로써 가치가 있는 정보를 있는 그대로 사용하는 행위는 보안을 허가한다.
 - 그외의 보안은 모두 금지한다.

즉, 이미지나 flv 를 가져와서 마냥 보여하는것은

보안이 기본적으로 풀려있습니다.

하지만 그외의 보안, 비트맵을 가져온다거나 사운드를 딴다거나(?) 하는 행위는

보안이 막혀있는 것이지요.



4. Get allow.

간단하게 말씀드리겠습니다.

제가 보안 모델에 대해서 맹비난하는 이유가 여기 있는데

보안을 푸는 방식에 있어서

참 재밌게도 일관된 방법이 전혀 없습니다.

URLLoader 는 알아서;;

Loader 는 load() 메소드 파라미터로;;

NetStream 은 프로퍼티로...;;

LocalConnection 은 별 거지같은 방법으로;;;

SWF Accessing 은 static 클래스로;;;

RTMP는 무조건 꺼지라하고...;;; (님하 매너연~)

이건 뭐 장난하는것도 아니고

보안 모델이 어려운 이유가 있었습니다.

결코 자신이 머리가 나쁜게 아니고 Flash 가 난잡하게 꼬여있었던 겁니다.

사실 저보고 일관성있게 하라그러면

도망가겠지만

그래도 이건 좀;;; 그렇지 않나요?

그렇다고 또 막아놓은것도 완전 막아놓은것도 아닙니다.

꼼수 쓰자면 후훗... 곰방하죠.

암튼 디테일한건 각자 레퍼런스형님께 여쭤보시기 바랍니다.



5. Summary

Flash 보안 모델은 일단 개념에 있어서

잘 정리되어 있어야 합니다.

그래야 정보를 다루고 복잡한 컨트롤에 있어서 체계적인 구조를 잡을 수 있을것입니다.

가장 중요한것은 정보의 종류와 사용함에 있어서의 종류.

이 두가지 구분은 알아두셔서 보안 모델을 미리 감지하고 시행착오 없으시길 바랍니다.

그럼 도움 되셨길.



6. 후원금 좀;;

가상의 후원금인데 이상하게 구걸하게 되네요 -_ㅡa

후원하고 5일후면 다시 후원할 수 있어요.

굽신굽신;;

한국의 많은 소프트웨어 업체들이 개발자를 제대로 관리하지 못하고(또는 안하고) 있다. 소프트웨어 개발은 정신에 의한 작업이다. 누가 하는 가에 따라서, 어떤 동기부여를 하는 가에 따라서, 어떤 환경에서 하는 가에 따라서, 어떻게 관리하는 가에 따라서 엄청나게 다른 결과를 만들어낸다.

하지만 관리라는 이름 하에 개발자에게 모욕적인 대우를 하는 경우도 많다. 작업에 지장이 있을 정도의 저사양 개발장비를 제공하고, 좁아터진 공간에, 계속 울리는 전화벨과 시끄러운 대화 소리, 휴식공간이라고는 전혀 없는 조직도 많다. 직원들의 일거수일투족을 감시하고, 심지어는 복장 검사를 하는 경우도 있다.

또한 프로젝트 데드라인을 맞추기 위해 새벽에야 겨우 집에 들어갔음에도 불구하고, 출근시간에 몇 분 늦었다고 해서 지각을 체크하고 전체 직원이 모인 회의에서 실명을 거론하는 회사도 있다. 그런 회사일수록 야근수당이 없고 교통비도 지급하지 않으며 사소한 비용을 아낀다. 한마디로 작은 비용을 절약함으로써, 신뢰 상실이라는 큰 비용을 지불하는 것이다.

그런 회사에서 만들어지는 소프트웨어는 품질이 나쁘다. 불행한 개발자들은 품질이 나쁜 소프트웨어를 만들어 낸다. 어쩌면 잠을 못 자고 피로에 지친 개발자들이 내쉬는 서글픈 한숨이 소프트웨어의 영혼에 스며들어 가는 것은 아닐까? 저주받은 소프트웨어. 마치 호러영화의 한 장면처럼 느껴진다.

회사는 직원들을 사랑하지 않으면서, 직원들에게 애사심을 강요하는 회사를 보고 있자면 실소가 나온다. 물론 회사로서는 직원들에게 사랑을 보여줄 수 없는 가장 큰 이유가, 열악한 비즈니스 환경으로 인한 비용적 압박 때문이라고 얘기할 것이다. 백분 양보하여 그것을 인정한다고 할 지라도, 그렇다면 도대체 왜 부적절한 관리자에게 관리를 맡기고 있는 것일까?

나쁜 관리자가 프로젝트를 망치고 있다!
업계를 보면 관리자의 자격이 전혀 없는 사람이 관리를 맡고 있는 경우가 무척 많다. 나쁜 관리의 비용은 엄청나다. 단지 팀 구성원들의 작업에 지장을 주는 정도가 아니라, 조직의 목표 달성에 해악을 미치며 결국 상당한 대가를 치르게 만들고 프로젝트를 완전히 망치는 경우가 빈번하다.

필자는 단지 관리자를 잘못 배정했기 때문에 수백억 원의 손해를 본 어느 대기업의 프로젝트를 경험한 적이 있다. 팀원들은 모두 유능했고 각자의 마음 속에 일을 잘하고자 하는 열정이 있었지만, 관리자의 무능과 변덕과 학대로 인해 팀원들은 모두 좀비가 되어갔다. 일부는 떠났고 일부는 일을 하지 않았고 일부는 하는 척을 했다. 결국 수년간 프로젝트를 진행했으나 결과는 나오지 않았고 프로젝트는 취소됐다. 몇 가지 추가적인 원인이 없었던 것은 아니지만, 가장 주요한 요인은 ‘나쁜 관리자의 존재’ 그 자체였다.

나쁜 관리자는 팀원들이 무엇을 하고 있는지 알지 못하며(또는 관심이 없으며), 팀원들의 능력을 제대로 파악하지 못한 채로, 원칙 없이 업무를 지시하며, 부적절한 인력을 배치하고, 팀원들과 제대로 대화를 나누지 않으며, 펫프로젝트(pet project, 고위층 또는 자신의 개인적인 관심으로 만들어낸 프로젝트)로 인해 업무 우선순위를 마구 바꾸고, 결과가 나와도 잘했는지 못했는지 제대로 판단하지 못한 채 자신의 기호에 따라 결과를 재단한다. 한마디로 그들은 조직의 목표와 팀원의 성장에는 아무런 관심이 없으며 단지 자신의 안위만 생각하는 사람들이다.

그러한 나쁜 관리자의 존재가 지극히 예외적인 경우라고 생각하는가? 만일 그렇다면 당신은 조직 생활의 경험이 많지 않든가, 아니면 억세게 운이 좋은 경우일 것이다. 그런 나쁜 관리자로 인하여 젊은 시절의 소중한 경험을 빼앗기는 팀원들이 몹시 많다. 나쁜 관리자의 해악은 단지 프로젝트의 실패로 나타나는 것뿐만 아니라, 사람들의 인생에서 그 시기에 필히 겪어야 할 소중한 경험까지 앗아가 버리는 것에 있다. 좋은 관리를 받아보지 못한 사람은 좋은 관리를 할 수가 없다.

좋은 관리자가 되기 위한 지침
그렇다면 좋은 관리란 어떻게 관리하는 것인가? 하단과 같이 몇 가지 지침을 제시할 수 있을 것이다.

첫째, 바라는 결과를 명확히 알려주어야 한다. 어떤 관리자들은 자신이 무엇을 원하는지 자기 스스로도 정확히 모르는 채 작업을 지시하고, 팀원의 작업 결과를 그날그날의 기분에 따라 자신의 기호대로 판단하곤 한다. 그런 관리자는 관리자로서의 자격이 없다.

둘째, 위임을 적절하게 수행해야 한다. 어떤 사람의 그릇은 위임할 수 있는 양의 크기로 정해진다. 즉 어떤 사람이 이루어낼 수 있는 최대 성과치는 그가 팀원들에게 권한을 위임할 수 있는 능력에 의해서 결정된다는 뜻이다. 할 일이 너무나 많지만 일할 시간이 없고 혼자서 모든 일을 처리하려고 하는 관리자는 탈진증후군(burnout syndrome)에 빠지게 된다. 그리고 탈진증후군에 빠진 관리자는 결국 팀을 궤멸시킨다.

셋째, 방법보다는 결과에 초점을 맞추어야 한다. 이 말에 오해가 없기를 바란다. 오로지 결과만 중요시하라는 뜻이 아니라, 결과가 올바르다면 방법은 팀원에게 맡겨두라는 뜻이다. 개발자 출신의 관리자는 자신이 선호하지 않은 방법으로 구현을 했다는 이유로 팀원을 질책하거나 업무를 회수하는 잘못을 저지르는 경우가 많다. 그런 관리자는 좋은 결과도 팀원들의 신뢰도 얻지 못할 것이다. 결과가 옳다면 그 방법은 팀원에게 맡겨두는 포용력을 가져야 한다.

넷째, 피드백을 주고, 코칭을 하고, 경력 개발을 지원해야 한다. 피드백이란 해당 직원의 업무 결과에 대해 어떻게 생각하는지 그 내용을 전달하는 것이다. 코칭은 일종의 도움을 주는 것으로서 선택 가능한 사항들 속에서 실행 계획을 만들도록 도와주는 것이다. 그리고 팀원이 새로운 지식과 경험을 쌓음으로써 성장할 수 있도록 경력 개발을 지원해야 한다. 팀원의 경력 개발에 전혀 신경을 쓰지 않은 관리자들이 너무 많다. 그것은 팀원을 일회용품으로 취급하고 있음을 스스로 증명하는 것과 같다. 경력 개발에 도움을 받은 팀원은 관심을 갖고 도와준 관리자를 언제까지나 기억할 것이다.

다섯째, 좋은 관리자는 자기 자신을 관리하는 사람이다. 좋은 관리자는 감정의 폭발에 반응하기보다는 사건에 대응한다. 불필요한 감정을 발산하여 팀원에게 공포심을 조장해서는 안 된다. 만일 감정이 폭발했거나 또는 잘못된 지시를 했다고 판단될 시에는 즉각 솔직하게 인정하고 사과를 해야 한다. 실수를 인정하는 관리자는 인간적으로 보인다.

좋은 관리 방법을 배우기는 힘들다. 왜냐하면 그것은 눈에 잘 보이지 않기 때문이다. 하지만 우리는 그것을 배우고 실천해야 한다. 그것이야말로 업계에 만연된 악순환의 고리를 끊어버리는 유일한 방법이기 때문이다. 우리가 겪은 불행한 경험을 다시금 후배들에게 전달해서는 안 된다.

비록 기술 중심의 소프트웨어 업체라고 할 지라도, 기술 관리란 기술이 아니라 사람을 다루는 것임을 잊지 말아야 한다. 회사가 가능한 범위 내에서 최상의 업무 환경을 제공하고, 개발자 개개인을 세심히 배려하는 피드백, 코칭, 경력 개발을 지원하는 관리자가 있는 조직이라면 개발자는 결코 불행하지 않을 것이며 더 나아가 어려운 일도 기꺼이 극복해 낼 것이다.

하지만 지금 이 순간에도 많은 기업들이 사소한 비용 절감과 무의미한 규칙 준수를 위해 직원들의 신뢰를 잃고 있으며, 나쁜 관리자를 배정함으로써 프로젝트와 팀원의 인생을 망치고 있다. 나쁜 관리자는 개인, 회사, 사회 모두에 악영향을 미치는 존재이다.

반면에 좋은 관리자는 탁월한 결과를 만들어내고 팀원들을 성장시키고 사회 전반에 좋은 인재를 공급한다. 그런 훌륭한 관리자가 어디 흔하냐고 항변하는 기업의 목소리가 들린다. 하지만 기업들이여, 그런 변명보다는 좋은 관리자를 채용하려는 노력, 그리고 양성하려는 노력, 그리고 그가 ‘진짜 관리’를 제대로 수행하였는지 평가하려는 노력을 무엇보다 먼저 기울여야 하지 않을까? @

출처 : ZDNet Korea (http://www.zdnet.co.kr/itbiz/column/anchor/hsryu/0,39030308,39162121,00.htm)

+ Recent posts