스토리 홈

인터뷰

피드

뉴스

조회수 10541

Next.js 튜토리얼 7편: 데이터 가져오기

* 이 글은 Next.js의 공식 튜토리얼을 번역한 글입니다.** 오역 및 오탈자가 있을 수 있습니다. 발견하시면 제보해주세요!목차1편: 시작하기 2편: 페이지 이동 3편: 공유 컴포넌트4편: 동적 페이지 5편: 라우트 마스킹6편: 서버 사이드 7편: 데이터 가져오기 - 현재 글8편: 컴포넌트 스타일링9편: 배포하기개요꽤 그럴듯한 Next.js 애플리케이션을 만드는 방법과 Next.js 라우팅 API의 모든 장점을 배웠습니다.대부분의 경우 데이터 소스에서  원격으로 데이터를 가져와야 합니다. Next.js는 페이지에 데이터를 가져오기 위한 표준 API를 제공합니다. getInitialProps라 불리는 비동기 함수를 사용하여 구현할 것입니다.주어진 페이지에 원격 데이터 소스를 통해 데이터를 가져오고 원하는 페이지에 props을 통해 전달할 수 있습니다. 서버와 클라이언트 둘 다 동작하도록 getInitialProps를 작성할 수 있습니다. 그래서 Next.js는 클라이언트와 서버에서 모두 사용할 수 있습니다. 이번 편에서는 getInitialProps를 사용하여 공개된 TVmaze API에서 가져온 데이터로 배트맨 TV 쇼에 대한 정보를 보여주는 애플리케이션을 구현할 예정입니다.설치이번 장에서는 간단한 Next.js 애플리케이션이 필요합니다. 다음의 샘플 애플리케이션을 다운받아주세요:아래의 명령어로 실행시킬 수 있습니다:이제 http://localhost:3000로 이동하여 애플리케이션에 접근할 수 있습니다.배트맨 쇼 데이터 가져오기데모 애플리케이션 내의 home 페이지에 블로그 포스트 목록이 있습니다. 배트맨 TV 쇼 목록을 표시할 것입니다.쇼의 데이터들을 하드코딩하는 대신에 원격 서버에서 그 정보를 가져옵시다.여기서는 TV 쇼를 가져오기 위해 TVMaze API를 사용합니다.TV 쇼 정보를 검색하는 API 입니다.먼저 isomorphic-unfetch를 설치해야 합니다. 데이터를 가져올 때 사용할 라이브러리입니다. 브라우저 fetch API 구현을 간단히 할 수 있도록 만들어진 것이지만 클라이언트와 서버 환경에서 모두 동작합니다.npm install --save isomorphic-unfetchpages/index.js를 다음과 같이 변경해주세요:위의 페이지에 있는 모든 내용은 아래에 표시된 Index.getInitialProps를 제외하고는 익숙할 것입니다:애플리케이션의 어떤 페이지에든 추가할 수 있는 정적 비동기 함수입니다. 이것을 사용하여 데이터를 가져오고 가져온 데이터를 props를 통해 페이지로 보낼 수 있습니다.보다시피 배트맨 TV 쇼 데이터를 가져오고 'shows' props를 통해 페이지로 전달합니다.위에서 보았던 getInitialProps 함수에서 가져온 데이터 숫자를 콘솔에 출력합니다.이제 브라우저 콘솔과 서버 콘솔을 살펴봅시다. 그리고 페이지를 새로고침 해주세요.페이지를 새로고침 한 후 출력되는 메시지는 어디에서 보였나요?- 서버 콘솔- 브라우저 콘솔- 둘 다- 어떤 콘솔에도 출력되지 않았다서버에서만 출력됩니다이 경우 메시지는 서버에서만 출력됩니다.이는 서버에서 페이지가 랜더링되기 때문입니다.이미 데이터를 가지고 있어 클라이언트에서 다시 정보를 가져올 필요가 없습니다.post 페이지 구현하기TV 쇼에 대한 자세한 정보를 보여주는 "/post" 페이지를 구현해봅시다.먼저 server.js를 열고 /p/:id 라우트를 다음과 같이 바꿔주세요.위처럼 바꾼 코드를 적용하기 위해 애플리케이션을 재실행시켜주세요.이전에는 title 쿼리 파라미터를 페이지에 매핑했습니다. 이제 id로 이름을 바꿔야합니다.다음과 같은 내용으로 pages/post.js를 변경해주세요.페이지의 getInitialProps을 살펴봅시다:여기에서 함수의 첫 번째 파라미터는 context 객체입니다. 정보를 가져올 때 사용할 수 있는 쿼리 필드를 가지고 있습니다.예제에서 쿼리 파라미터로부터 보여지는 ID를 선택하고 TVMaze API로부터 데이터를 가져옵니다.이 getInitialProps 함수에서 표시할 제목을 출력하는 console.log를 추가했습니다. 이제 어디에서 출력되는지 볼 수 있습니다.서버와 클라이언트의 콘솔를 둘 다 열어주세요.그 다음 홈페이지 http://localhost:3000로 이동하여 배트맨 쇼 제목을 클릭하세요.위에서 애기했던 console.log 메시지가 보여지는 장소는 어디인가요?- 서버 콘솔- 브라우저 콘솔- 콘솔 둘 다- 아무 콘솔에서도 출력되지 않는다클라이언트 사이드에서 데이터 가져오기브라우저 콘솔에서 메시지를 볼 수 있습니다.클라이언트 사이드를 통해 포스트 페이지에 이동했기 때문입니다. 그런 다음 클라이언트 사이드로부터 데이터를 가져오는 것은 가장 좋은 방법입니다.예를 들어 http://localhost:3000/p/975에 직접 이동한다면 클라이언트가 아닌 서버에서 메시지가 출력되는 것을 볼 수 있습니다.마무리데이터를 가져오고 서버 사이드에서 렌더링하도록 만드는 Next.js의 가장 중요한 기능 중 하나를 배웠습니다.대부분의 유스 케이스에서 충분히 사용할 수 있는 getInitialProps의 기본을 배웠습니다. 더 많은 것을 배우고 싶다면 Next.js의 문서 중 data fetching 문서를 참고할 수 있습니다.#트레바리 #개발자 #안드로이드 #앱개발 #Next.js #백엔드 #인사이트 #경험공유
조회수 1950

Tips for building fast portrait segmentation network with TensorFlow Lite

PrefaceDeep learning has led to a series of breakthroughs in many areas. However, successful deep learning models often require significant amounts of computational resources, memory and power. Deploying efficient deep learning models on mobile devices became the main technological challenge for many mobile tech companies.Hyperconnect developed a mobile app named Azar which has a large fan base all over the world. Recently, Machine Learning Team has been focusing on developing mobile deep learning technologies which can boost user experience in Azar app. Below, you can see a demo video of our image segmentation technology (HyperCut) running on Samsung Galaxy J7. Our benchmark target is a real-time (>= 30 fps) inference on Galaxy J7 (Exynos 7580 CPU, 1.5 GHz) using only a single core.Figure 1. Our network runs fast on mobile devices, achieving 6 ms of single inference on Pixel 1 and 28 ms on Samsung Galaxy J7. Full length video. There are several approaches to achieve fast inference speed on mobile device. 8-bit quantization is one of the popular approaches that meet our speed-accuracy requirement. We use TensorFlow Lite as our main framework for mobile inference. TensorFlow Lite supports SIMD optimized operations for 8-bit quantized weights and activations. However, TensorFlow Lite is still in pre-alpha (developer preview) stage and lacks many features. In order to achive our goal, we had to do the following:Understand details of TensorFlow and Tensorflow Lite implementation.Design our own neural network that can fully utilize optimized kernels of TensorFlow Lite. (Refer to 1, 2 and 3)Modify TOCO: TensorFlow Lite Optimizing Converter to correctly convert unsupported layers. (Refer to 4)Accelerate several quantized-layers with SIMD optimized code. (Refer to 5 and 6)We are willing to share our trials and errors in this post and we hope that readers will enjoy mobile deep learning world :)1) Why is depthwise separable layer fast in Tensorflow Lite ?Implementing low-level programs requires a bit different ideas and approaches than usual. We should be aware that especially on mobile devices using cache memory is important for fast inference.Figure 2. Memory access requires much more energy (640 pJ) than addition or multiplication.Accessing cache memory (8 pJ) is much cheaper than using the main memory (table courtesy of Ardavan Pedram) In order to get insight into how intrinsics instructions are implemented in Tensorflow Lite, we had to analyze some implementations including depthwise separable convolution with 3x3 kernelsBelow we describe some of the main optimization techniques that are used for building lightweight and faster programs.Loop UnrollingCan you spot the difference between the following two code fragments?for (int i = 0; i < 32; i++) { x[i] = 1; if (i%4 == 3) x[i] = 3; } for (int i = 0; i < 8; i++) { x[4*i ] = 1; x[4*i+1] = 1; x[4*i+2] = 1; x[4*i+3] = 3; } The former way is what we usually write, and the latter is loop-unrolled version of former one. Even though unrolling loops are discouraged from the perspective of software design and development due to severe redundancy, with low-level architecture this kind of unrolling has non-negligible benefits. In the example described above, the unrolled version avoids examining 24 conditional statements in for loop, along with neglecting 32 conditional statements of if.Furthermore, with careful implementation, these advantages can be magnified with the aid of SIMD architecture. Nowadays some compilers have options which automatically unroll some repetitive statements, yet they are unable to deal with complex loops.Separate implementation for each caseConvolution layer can take several parameters. For example, in depthwise separable layer, we can have many combinations with different parameters (depth_multiplier x stride x rate x kernel_size). Rather than writing single program available to deal with every case, in low-level architectures, writing number of case-specific implementations is preferred. The main rationale is that we need to fully utilize the special properties for each case. For convolution operation, naive implementation with several for loops can deal with arbitrary kernel size and strides, however this kind of implementation might be slow. Instead, one can concentrate on small set of actually used cases (e.g. 1x1 convolution with stride 1, 3x3 convolution with stride 2 and others) and fully consider the structure of every subproblem.For example, in TensorFlow Lite there is a kernel-optimized implementation of depthwise convolution, targeted at 3x3 kernel size:template <int kFixedOutputY, int kFixedOutputX, int kFixedStrideWidth, int kFixedStrideHeight> struct ConvKernel3x3FilterDepth8 {}; Tensorflow Lite further specifies following 16 cases with different strides, width and height of outputs for its internal implementation:template <> struct ConvKernel3x3FilterDepth8<8, 8, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<4, 4, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<4, 2, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<4, 1, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<2, 2, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<2, 4, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<1, 4, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<2, 1, 1, 1> { ... } template <> struct ConvKernel3x3FilterDepth8<4, 2, 2, 2> { ... } template <> struct ConvKernel3x3FilterDepth8<4, 4, 2, 2> { ... } template <> struct ConvKernel3x3FilterDepth8<4, 1, 2, 2> { ... } template <> struct ConvKernel3x3FilterDepth8<2, 2, 2, 2> { ... } template <> struct ConvKernel3x3FilterDepth8<2, 4, 2, 2> { ... } template <> struct ConvKernel3x3FilterDepth8<2, 1, 2, 2> { ... } template <> struct ConvKernel3x3FilterDepth8<1, 2, 2, 2> { ... } template <> struct ConvKernel3x3FilterDepth8<1, 4, 2, 2> { ... } Smart Memory Access PatternSince low-level programs are executed many times in repetitive fashion, minimizing duplicated memory access for both input and output is necessary. If we use SIMD architecture, we can load nearby elements together at once (Data Parallelism) and in order to reduce duplicated read memory access, we can traverse the input array by means of a snake-path.Figure 3. Memory access pattern for 8x8 output and unit stride, implemented in Tensorflow Lite's depthwise 3x3 convolution. The next example which is targeted to be used in much smaller 4x1 output block also demonstrates how to reuse preloaded variables efficiently. Note that the stored location does not change for variables which are loaded in previous stage (in the following figure, bold variables are reused):Figure 4. Memory access pattern for 4x1 output and stride 2, implemented in Tensorflow Lite's depthwise 3x3 convolution. 2) Be aware of using atrous depthwise convolutionAtrous (dilated) convolution is known to be useful to achieve better result for image segmentation[1]. We also decided to use atrous depthwise convolution in our network. One day, we tried to set stride for atrous depthwise convolution to make it accelerate computation, however we failed, because the layer usage in TensorFlow (≤ 1.8) is constrained.In Tensorflow documentation of tf.nn.depthwise_conv2d (slim.depthwise_conv2d also wraps this function), you can find this explanation of rate parameter.rate: 1-D of size 2. The dilation rate in which we sample input values across the height and width dimensions in atrous convolution. If it is greater than 1, then all values of strides must be 1.Even though TensorFlow doesn’t support strided atrous function, it doesn’t raise any error if you set rate > 1 and stride > 1. <!-- The output of layer doesn't seem to be wrong. -->>>> import tensorflow as tf >>> tf.enable_eager_execution() >>> input_tensor = tf.constant(list(range(64)), shape=[1, 8, 8, 1], dtype=tf.float32) >>> filter_tensor = tf.constant(list(range(1, 10)), shape=[3, 3, 1, 1], dtype=tf.float32) >>> print(tf.nn.depthwise_conv2d(input_tensor, filter_tensor, strides=[1, 2, 2, 1], padding="VALID", rate=[2, 2])) tf.Tensor( [[[[ 302.] [ 330.] [ 548.] [ 587.]] [[ 526.] [ 554.] [ 860.] [ 899.]] [[1284.] [1317.] [1920.] [1965.]] [[1548.] [1581.] [2280.] [2325.]]]], shape=(1, 4, 4, 1), dtype=float32) >>> 0 * 5 + 2 * 6 + 16 * 8 + 9 * 18 # The value in (0, 0) is correct 302 >>> 0 * 4 + 2 * 5 + 4 * 6 + 16 * 7 + 18 * 8 + 20 * 9 # But, the value in (0, 1) is wrong! 470 Let’s find the reason why this difference happened. If we just put tf.space_to_batch and tf.batch_to_space before and after convolution layer, then we can use convolution operation for atrous convolution (profit!). On the other hand, it isn’t straightforward how to handle stride and dilation together. In TensorFlow, we need to be aware of this problem in depthwise convolution.3) Architecture design principles for efficient segmentation networkUsually segmentation takes more time than classification since it has to upsample high spatial resolution map. Therefore, it is important to reduce inference time as much as possible to make the application run in real-time.It is important to focus on spatial resolution when designing real-time application. One of the easiest ways is to reduce the size of input images without losing accuracy. Assuming that the network is fully convolutional, you can accelerate the model about four times faster if the size of input is halved. In literature[2], it is known that small size of input images doesn’t hurt accuracy a lot.Another simple strategy to adopt is early downsampling when stacking convolution layers. Even with the same number of convolution layers, you can reduce the time with strided convolution or pooling within early layers.There is also a tip for selecting the size of input image when you use Tensorflow Lite quantized model. The optimized implementations of convolution run best when the width and height of image is multiple of 8. Tensorflow Lite first loads multiples of 8, then multiples of 4, 2 and 1 respectively. Therefore, it is the best to keep the size of every input of layer as a multiple of 8.Substituting multiple operations into single operation can improve speed a bit. For example, convolution followed by max pooling can be usually replaced by strided convolution. Transpose convolution can also be replaced by resizing followed by convolution. In general, these operations are substitutable because they perform the same role in the network. There are no big empirical differences among these operations. <!-- substitutable -->Tips described above help to accelerate inference speed but they can also hurt accuracy. Therefore, we adopted some state-of-the-art blocks rather than using naive convolution blocks.Figure 5.  Atrous spatial pyramid pooling (figure courtesy of Liang-Chieh Chen) Atrous spatial pyramid pooling[1] is a block which mimics the pyramid pooling operation with atrous convolution. DeepLab uses this block in the last layer.We also substitute most of the convolution layers with efficient depthwise separable convolution layers. They are basic building blocks for MobileNetV1[3] and MobileNetV2[4] which are well optimized in Tensorflow Lite.4) Folding batchnorm into atrous depthwise convolutionWhen quantizing convolution operation followed by batchnorm, batchnorm layer must be folded into the convolution layers to reduce computation cost. After folding, the batchnorm is reduced to folded weights and folded biases and the batchnorm-folded convolution will be computed in one convolution layer in TensorFlow Lite[5]. Batchnorm gets automatically folded using tf.contrib.quantize if the batchnorm layer comes right after the convolution layer. However, folding batchnorm into atrous depthwise convolution is not easy.In TensorFlow’s slim.separable_convolution2d, atrous depthwise convolution is implemented by adding SpaceToBatchND and BatchToSpaceND operations to normal depthwise convolution as mentioned previously. If you add a batchnorm to this operation by including argument normalizer_fn=slim.batch_norm, batchnorm does not get attached directly to the convolution layer. Instead, the graph will look like the diagram below: SpaceToBatchND → DepthwiseConv2dNative → BatchToSpaceND → BatchNorm The first thing we tried was to modify TensorFlow quantization to fold batchnorm bypassing BatchToSpaceND without changing the order of operations. With this approach, the folded bias term remained after BatchToSpaceND, away from the convolution layer. Then, it became separate BroadcastAdd operation in TensorFlow Lite model rather than fused into convolution. Surprisingly, it turned out that BroadcastAdd was much slower than the corresponding convolution operation in our experiment:Timing log from the experiment on Galaxy S8 ... [DepthwiseConv] elapsed time: 34us [BroadcastAdd] elapsed time: 107us ... To remove BroadcastAdd layer, we decided to change the network itself instead of fixing TensorFlow quantization. Within slim.separable_convolution2d layer, we swapped positions of BatchNorm and BatchToSpaceND. SpaceToBatchND → DepthwiseConv2dNative → BatchNorm → BatchToSpaceND Even though batchnorm relocation could lead to different outputs values compared to the original, we did not notice any degradation in segmentation quality.5) SIMD-optimized implementation for quantized resize bilinear layerAt the time of accelerating TensorFlow Lite framework, conv2d_transpose layer was not supported. However, we could use ResizeBilinear layer for upsampling as well. The only problem of this layer is that there is no quantized implementation, therefore we implemented our own SIMD quantized version of 2x2 upsampling ResizeBilinear layer.Figure 6. 2x2 bilinear upsampling without corner alignnment. To upsample image, original image pixels (red circles) are interlayed with new interpolated image pixels (grey circles). In order to simplify implementation we do not compute pixel values for the bottommost and rightmost pixels, denoted as green circles.for (int b = 0; b < batches; b++) { for (int y0 = 0, y = 0; y <= output_height - 2; y += 2, y0++) { for (int x0 = 0, x = 0; x <= output_width - 2; x += 2, x0++) { int32 x1 = std::min(x0 + 1, input_width - 1); int32 y1 = std::min(y0 + 1, input_height - 1); ResizeBilinearKernel2x2(x0, x1, y0, y1, x, y, depth, b, input_data, input_dims, output_data, output_dims); } } } Every new pixel value is computed for each batch separately. Our core function ResizeBilinearKernel2x2 computes 4 pixel values across multiple channels at once.Figure 7. Example of 2x2 bilinear upsampling of top left corner of image. (a) Original pixel values are simply reused and (b) – (d) used to interpolate new pixel values. Red circles represent original pixel values. Blue circles are new interpolated pixel values computed from pixel values denoted as circles with black circumference. NEON (Advanced SIMD) intrinsics enable us to process multiple data at once with a single instruction, in other words processing multiple data at once. Since we deal with uint8 input values we can store our data in one of the following formats uint8x16_t, uint8x8_t and uint8_t, that can hold 16, 8 and 1 uint8 values respectively. This representation allows to interpolate pixel values across multiple channels at once. Network architecture is highly rewarded when channels of feature maps are multiples of 16 or 8:// Handle 16 input channels at once int step = 16; for (int ic16 = ic; ic16 <= depth - step; ic16 += step) { ... ic += step; } // Handle 8 input channels at a once step = 8; for (int ic8 = ic; ic8 <= depth - step; ic8 += step) { ... ic += step; } // Handle one input channel at once for (int ic1 = ic; ic1 < depth; ic1++) { ... } SIMD implementation of quantized bilinear upsampling is straightforward. Top left pixel value is reused (Fig. 7a). Bottom left (Fig. 7b) and top right (Fig. 7c) pixel values are mean of two adjacent original pixel values. Finally, botom right pixel (Fig. 7d) is mean of 4 diagonally adjacent original pixel values.The only issue that we have to take care of is 8-bit integer overflow. Without a solid knowledge of NEON intrinsics we could go down the rabbit hole of taking care of overflowing by ourself. Fortunately, the range of NEON intrinsics is broad and we can utilize those intrinsics that fit our needs. The snippet of code below (using vrhaddq_u8) shows an interpolation (Fig. 7d) of 16 pixel values at once for bottom right pixel value:// Bottom right output_ptr += output_x_offset; uint8x16_t left_interpolation = vrhaddq_u8(x0y0, x0y1); uint8x16_t right_interpolation = vrhaddq_u8(x1y0, x1y1); uint8x16_t bottom_right_interpolation = vrhaddq_u8(left_interpolation, right_interpolation); vst1q_u8(output_ptr, bottom_right_interpolation); 6) Pitfalls in softmax layer and demo codeThe first impression of inference in TensorFlow Lite was very slow. It took 85 ms in Galaxy J7 at that time. We tested the first prototype of TensorFlow Lite demo app by just changing the output size from 1,001 to 51,200 (= 160x160x2)After profiling, we found out that there were two unbelievable bottlenecks in implementation. Out of 85 ms of inference time, tensors[idx].copyTo(outputs.get(idx)); line in Tensor.java took up to 11 ms (13 %) and softmax layer 23 ms (27 %). If we would be able to accelerate those operations, we could reduce almost 40 % of the total inference time!First, we looked at the demo code and identified tensors[idx].copyTo(outputs.get(idx)); as a source of problem. It seemed that the slowdown was caused by copyTo operation, but to our surprise it came from int[] dstShape = NativeInterpreterWrapper.shapeOf(dst); because it checks every element (in our case, 51,200) of array to fill the shape. After fixing the output size, we gained 13 % speedup in inference time.<T> T copyTo(T dst) { ... // This is just example, of course, hardcoding output shape here is a bad practice // In our actual app, we build our own JNI interface with just using c++ code // int[] dstShape = NativeInterpreterWrapper.shapeOf(dst); int[] dstShape = {1, width*height*channel}; ... } The softmax layer was our next problem. TensorFlow Lite’s optimized softmax implementation assumes that depth (= channel) is bigger than outer_size (= height x width). In classification task, the usual output looks like [1, 1(height), 1(width), 1001(depth)], but in our segmentation task, depth is 2 and outer_size is multiple of height and width (outer_size » depth). Implementation of softmax layer in Tensorflow Lite is optimized for classification task and therefore loops over depth instead of outer_size. This leads to unacceptably slow inference time of softmax layer when used in segmentation network.We can solve this problem in many different ways. First, we can just use sigmoid layer instead of softmax in 2-class portrait segmentation. TensorFlow Lite has very well optimized sigmoid layer.Secondly, we could write SIMD optimized code and loop over depth instead of outer_size. You can see similar implementation at Tencent’s ncnn softmax layer, however, this approach has still its shortcomings. Unlike ncnn, TensorFlow Lite uses NHWC as a default tensor format:Figure 8. NHWC vs NCHW In other words, for NHWC, near elements of tensor hold channel-wise information and not spatial-wise. It is not simple to write optimized code for any channel size, unless you include transpose operation before and after softmax layer. In our case, we tried to implement softmax layer assumming 2-channel output.Thirdly, we can implement softmax layer using pre-calculated lookup table. Because we use 8-bit quantization and 2-class output (foreground and background) there are only 65,536 (= 256x256) different combinations of quantized input values that can be stored in lookup table:for (int fg = 0; fg < 256; fg++) { for (int bg = 0; bg < 256; bg++) { // Dequantize float fg_real = input->params.scale * (fg - input->params.zero_point); float bg_real = input->params.scale * (bg - input->params.zero_point); // Pre-calculating Softmax Values ... // Quantize precalculated_softmax[x][y] = static_cast<uint8_t>(clamped); } } ConclusionIn this post, we described the main challenges we had to solve in order to run portrait segmentation network on mobile devices. Our main focus was to keep high segmentation accuracy while being able to support even old devices, such as Samsung Galaxy J7. We wish our tips and tricks can give a better understanding of how to overcome common challenges when designing neural networks and inference engines for mobile devices.At the top of this post you can see portrait segmentation effect that is now available in Azar app. If you have any questions or want to discuss anything related to segmentation task, contact us at [email protected]. Enjoy Azar and mobile deep learning world!References[1] L. Chen, G. Papandreou, F. Schroff, H. Adam. Rethinking Atrous Convolution for Semantic Image Segmentation. June 17, 2017, https://arxiv.org/abs/1706.05587[2] C. Szegedy, V. Vanhoucke, S. Ioffe, J. Shlens, Z. Wojna. Rethinking the Inception Architecture for Computer Vision. December 11, 2015, https://arxiv.org/abs/1512.00567[3] A. Howard, M. Zhu, B. Chen, D. Kalenichenko, W. Wang, T. Weyand, M. Andreetto, H. Adam. MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications, April 17, 2017, https://arxiv.org/abs/1704.04861[4] M. Sandler, A. Howard, M. Zhu, A. Zhmoginov, L. Chen. MobileNetV2: Inverted Residuals and Linear Bottlenecks. January 18, 2018, https://arxiv.org/abs/1801.04381[5] B. Jacob, S. Kligys, B. Chen, M. Zhu, M. Tang, A. Howard, H. Adam, D. Kalenichenko. Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference. December 15, 2017, https://arxiv.org/abs/1712.05877
조회수 950

서비스 기획 시작하기

 모든 창업자들이 처음 서비스를 도안하고 시작하실 때는 대부분이 염두하고 있는 서비스에 관하여 "이 정도 서비스라면 많은 사람들이 사용할 거야."라는 간단한 생각에서 시작한다고 생각합니다. 그리고 그러한 서비스를 기반으로 팀을 정비하고, 서비스를 제작하는 것이 문득 보기에는 쉬워 보일 수 있습니다. 심지어 K대, 아니 어느 대학 교수님은 인문계 학생들에게 과제로 애플리케이션을 만들어 보라는 황당한 과제를 학기 중에 완료해 제출하라는 어이없는 사건도 있었지요...전설의 시작전설의 공무원드립많은 분들이 그렇게 생각하시는 이유는,1. 한 번도 서비스를 제작해 본 경험이 없다. 2. 서비스 기획과 계획에 대한 디테일 한 점들을 깊이 생각해 보지 않았다. 3. 서비스 제작을 하면서 거치게 되는 과정에 대하여 생각해 보지 않았다.이 정도 이유가 가장 주 요인이라고 생각이 됩니다. 하지만, 견고한 건물을 짓기 위해서는 단단한 지반과 뼈대가 기본이 되어야 하듯,스타트업에도 견고한 Framework가 기반되어야 한다고 생각합니다. 주먹구구식으로 하나하나 만들어 나가는 서비스는 제대로 서비스를  시작할 수도 없고, 그렇게 시작하더라도 더 많은 장애요소들 때문에 금방 지칠  수밖에 없죠. 그리고 Framework를 만들기 전 확실하게 선결되어야 하는 것은 "자신의 서비스를 이해하는 것"입니다. 기본적으로 자신이 만들 서비스에 대하여 이해는 있지만, 서비스를 생각해 보지 못한 다른 사람들에게 보다 빠르게 이해시키고 설명하기 위해서 많은 시간을 할애해야 한다는 것이지요. 예를 들자면, 많은 분들이 "서비스에 대해서 간단하게 설명해  주세요."라고 질문을 하면,  "어떻게 설명을 시작해야 할지, 어떻게 표현해야  할지, 뭐부터 설명을 시작해야  할지" 등에 대해 순간 갈피를 못 잡는 경우가 있을 거예요. 이러한 분들에게 가장 필요한 맥락으로, 제가 추천드리는 것은 "자신의 서비스를 육하원칙에 따라 서술해 보기"입니다.보여드리자면,"(서비스명)은/는 (누구)에게 (어떤 상황)에서 (어떤 서비스)을/를 (어떤 형식으로) 제공하여, (어떤 갈등 상황)을/를 (어떤 방법)을/를 통하여 해결해 줄 수 있는  서비스이다."라는 것을 한번 만들어 보세요. 서비스를 만드는 것은 "선을 잇다, " Just Do It."같은 어떤 철학을 담고 있는 워딩에서 시작하는 것이 아니라, 어떤 서비스를 만들어서 현재 어떤 갈등 상황이나 장애요소들을 해결해 나가겠다는 명확한 목표 설정과 시장 설정의 배경이 기반이 되어야 시작할 수 있습니다. 예를 들어, 저의 창업아이템 같은 경우는, "비플로트는 현재 문화예술 콘텐츠 산업에서 게이트키퍼들이 가지고 있는 콘텐츠 선점 현상을 개선하기 위하여, 문화예술 제작자, 이용자, 기업 들이 쉽게 문화예술 콘텐츠를 유용할 수 있는 콘텐츠 공유 SNS 플랫폼이다."로 설정, "문화예술 콘텐츠 시장은 지금 어떠한 상황에 있나." "콘텐츠 제작자들이 겪고 있는 문화콘텐츠 집중화 현상이란 어떤 것인가." "다른 서비스들이 이러한 문제들을 해결하려 했던 경험이 있는가." "이러한 서비스를 진행하기 위하여 어떤 플랫폼이 좋을 것인가."상관관계에 대하여 간단한 인포그래픽을 제작했었죠 이런식의 이미지화도 추천드립니다.등 이후에 진행될 엄청나게 많은 과제들을 파악할 수 있었고, 이를 통하여 팀원들과의 공유를 통하여 서비스를 많이 발전시켜 나갔습니다. 어찌 보면 아무것도 아닌 것 같지만, 육하원칙으로 서비스를 설명할 줄 아는 것이 진정한 IA(Information Architecture)의 시작이고, 모든 서비스의 시작이라고 생각합니다. 기획자가 굳이 아니셔도 전혀  상관없습니다. 처음 기반을 다시 다지시는 게 굉장히 중요하니, 반드시 한 번은 팀원들과 이 육하원칙 만들기를 시작하고 서비스를 만드시길 바랍니다.#코인원 #블록체인 #기술기업 #암호화폐 #스타트업인사이트
조회수 2087

[사내 인터뷰] 전산팀 김원석 부장 "60살에도 개발하는 핀테크 전문 아키텍처가 꿈"

Q. 자기소개를 해달라. 30CUT에서 무슨 일을 맡고 있나?전산팀을 리드하고 있다. 시스템 세팅, 운영 및 개발을 총괄한다. 자세하게는 서버 세팅, 데이터 설계, 보안 시스템 아키텍처 설계 구성 및 도입. 사내 업무를 위한 전반적인 ERP 구성, 홈페이지 개발 및 관리, NH농협은행 협업 프로그램 개발 등을 총괄하고 있다.Q. 30CUT에 합류하기 전에는 어떤 일을 했나?써티컷에 오기 바로 전에는 캐피털 기업에서 전산실 팀장으로 근무했다. 전체 커리어로 보자면 개발자로 십 년 넘게 일했다. 통계회사, 회계법인, 금융기업을 거쳤다. 주로 ERP 시스템을 구축하는 일을 해왔다.Q. 서준섭 대표님과 함께 30CUT을 창립한 멤버다. 어떻게 만나게 됐나?처음에는 지인 소개로 만났다. ‘사업을 해보자’고 만난 것도 아니고 그냥 가벼운 티타임이나 술자리에서 만나 금융에 대한 이야기를 나눴다. 대표님도 나도 금융업에 종사하고 있다 보니 공유할 생각들이 많았다. 그렇게 만난 시간이 두 달 정도였다. 어느 날 대표님이 ‘사표 쓰고 사업을 해보려 하는데 같이 할 생각 없냐’고 물어보시더라. 그동안 만나오면서 쌓였던 신뢰가 있었기 때문에 한치의 망설임도 없이 쓰겠다고 했다. 그렇게 함께 준비해서 작년 10월에 창립했다Q. 30CUT의 최대 장점이라고 생각하는 것은 무엇인가?다른 회사들을 보면 대부분 팀장 급은 금융기업 출신이 많다. 그에 비해 우리 회사는 회계법인, 삼성전자, 캐피털 등 출신 분야가 다양하다는 것이 강점이다. 매니징을 담당하는 팀장들이 각자 자신의 전문 분야에서 탁월한 능력을 갖고 있고 잘 할 수 있다는 확신과 열정도 뛰어나다. 팀원들에게도 좋은 영향을 끼치기 위해 노력하고 있다. Q. 전산 팀원들이 부장님을 굉장히 좋아한다. 정근님은 부장님을 보고 입사했다고 할 정도인데… 리더로서 팀의 만족도를 높일 수 있는 비결이 뭔가?나는 사원부터 주임, 대리, 차장까지 다 겪어보지 않았나. 윗사람도 모셔보고 아래 직원들도 함께 해보면서 신념이 하나 생겼다. 바로 ‘내가 들어서 기분 나빴던 말이나 행동은 하지 않겠다’라는 거다. 이 신념을 지키기 위해서 항상 노력한다. 나도 노력하지만 지금 팀원들이 알아서 너무나 잘 해주고 있어서 딱히 트러블이 없다. 우리 팀 같은 경우 경영 학도에서 개발자가 된 김프로(바로 이전 인터뷰의 주인공, 타이거!)나 근래 입사한 이프로나 열정이 대단하다. 스스로 공부하고 발전하는 친구들이라 1-2년 뒤가 더 기대된다. Q. 30CUT이 어떤 회사로 성장해 나가길 원하나? 내가 꿈꾸는 회사의 모습은?비즈니스적으로는 우선 P2P 대출업이기 때문에 투자자 보호가 제일 우선이다. 대출자들을 잘 선별하기 위해 기존의 신용평가 시스템과 더불어 우리만의 노하우를 축적해야 한다. 결과적으로 부도 확률이 낮은 안전한 대출 채권 포트폴리오를 구성하는 게 중요한 가치라고 생각한다. 조직문화적으로는 다른 금융기업에 비해 좀 더 젊은 느낌의 회사가 되기를 바란다. 금융기업들이 워낙 보수적인데, 우리는 핀테크 기업인만큼 탄력근무제를 도입한다든지 유연한 문화가 필요하다. Q. 핀테크 기업에서 개발의 비중은 막중하다. 30CUT이 성장하는 과정에서 전산팀이 어떤 역할을 해야 한다고 생각하나?30CUT은 핀테크 기업이다. 물론 ‘핀(금융)’도 중요하지만 핵심은 ‘테크’라고 생각한다. 기술이 탄탄하게 뒷받침을 해줘야 한다. 30CUT이 최소한의 핵심인력으로 신속한 업무처리가 가능할 수 있도록 자동화 및 첨단 IT 시스템을 만드는 것이 개발팀의 역할이다. 오퍼레이팅 비용을 줄이면서 회사 이익을 극대화할 수 있는 방향으로 전산팀을 이끌어 가고 있다.   Q. 올해 개인적인 목표는?첫 번째는 업무적인 건데, 론칭이 되고 대출이 나갔을 때 지금 구성되어 있는 시스템에서 오류가 나지 않게 하는 것이 가장 큰 목표다. 밸런스를 맞추는 것이 꽤 어려운 작업이라 심혈을 기울이고 있다. 두 번째는…음… 회사가 돈을 잘 버는 것?(웃음)Q. 10년 뒤 어떤 사람이 되고 싶은가?환갑에도 일을 하는 아키텍처가 되고 싶다(10년 뒤에 환갑은 아니지만....). 우리나라에서 손 꼽히는 핀테크 계의 전문 아키텍처로 성장하는 것이 목표다. 60살의 아키텍처… 멋지지 않나? :) #비욘드플랫폼서비스 #비욘드펀드 #팀원 #팀원소개 #팀원인터뷰 #인터뷰 #사내문화 #기업문화 #조직문화
조회수 1465

하드웨어 스타트업의 딜레마 (1)

우리는 전 세계적인 스타트업 붐의 시대에 살고 있다. 여러 분야에서 혁신적인 스타트업들이 전 세계적으로 생겨나고 있다. 한국도 이러한 스타트업 붐의 중심에 있다. 한국에서도 창의적이고 도전적인 창업가들이 여러 분야에서 활동하고 있다. 다만 좀 아쉬운 것은 한국의 스타트업이 서비스, 게임 등 일부 분야에 편중되어 있다는 생각을 많이 하게 된다. 기술 중심의 스타트업은 상대적으로 적은 편이고 그중에서도 하드웨어 기반의 스타트업은 더욱 적은 편이다. 왜 이렇게 기술기반 하드웨어 스타트업이 적을까? 아이디어가 적어서? 아이디어의 부재는 스타트업의 발목을 잡지 않는다. 아마도 어떠한 기반도 없는 스타트업이 넘어야 할 난제들이 서비스, 게임 등의 스타트업에 비해 기술기반 하드웨어 스타트업이 더 많기 때문이 아닐까 싶다. 물론 그건 미국이나 한국이나 마찬가지 이겠지만, 초기 스타트업에 투자하는 투자자들이 적은 한국에서는 그 장벽들이 더욱 높게 느껴지기 때문에 그렇지 않나 싶다. 하지만 리스크와 기회는 동전의 양면이다. 누구나 쉽게  들어올 수 없는 시장이라면 들어와서 성공한다면 더 큰 기회가 있다. 그리고 그  기회를 잡기 위해서는 어떠한 문제가 앞에 펼쳐져 있는지 미리 안다면 조금이나마 도움이 되지 않을까라는 생각으로 나의 경험에 기반한 이야기를 나누려고 한다.  하드웨어 스타트업은 크게 4가지로 나눌 수 있다. 첫 번째가 혁신적인 원천기술을 바탕으로 새로운 반도체를 만들어내는 Fabless 반도체 회사이다. 이러한 회사로 유명한 회사는 인텔, 퀄컴, ATI 같은 회사이다. 이 분야는 대표적인 High Risk & High Return의 사업구조를 가지고 있다. 기술적 장벽이 높아서 한 번 시장에 성공적으로 진입을 하면 엄청난 수익을 만들어 낼 수 있는 사업이긴 하지만 오랜 개발 시간과 많은 자본이 필요한 사업이다. 이런 회사들은 대개 원천 기술을 가지고 있고 이를 기반으로 반도체를 만들어낸다. 실리콘 밸리가 처음 생겼을 때 이러한 회사들이 실리콘 밸리를 키워왔고 지금도 실리콘 밸리에는 이러한 스타트업들을 심심치 않게 볼 수 있다. 원천기술을 바탕으로 시장에 진입해서 IPO를 가기도 하고 중간에 큰 반도체 회사에 M&A가 되기도 한다.두 번째는 완성품 업체에 모듈을 납품하는 형태의 회사이다. 시장에 존재하는 원천기술 혹은 반도체를 기반으로 자신만의 노하우와 기술을 가지고 모듈화 해서 다른 기업에 판매하는 회사이다. 이런 스타트업들은 대부분 대기업에 모듈을 납품하는 것에 목숨을 건다. 고부가 가치의 사업은 아니지만 대기업 납품선을 잘 타게 되면 나름 안정적인 성장을 할 수 있는 사업이다. 하지만 언제나 대기업의 내재화에 대한 위협과 단가 깎기로 인한 수익성 악화의 위협 요인을 가지고 있다. 케이스 바이 케이스 다르긴 하지만 대체로 성장의 한계를 가지고 있다.세 번째 부류는 서비스 업체의 서비스를 위한 제품을 만들어내는 부류이다. 주로 통신업체, 미디어 업체들을 위한 제품들을 개발한다. 이런 업체 중 대표적으로 성공한 스타트업은 미국에서는 Cisco이고 한국에서는 휴맥스 정도가 될 것 같다.  이러한 업체들의 경우 원천 기술을 가지고 시장의 표준을 만들어나가는 업체들도 있고 아니면 제조 경쟁력과 영업력을 바탕으로 성장하는 업체들이 있다. 대부분 단말기 (STB, 공유기)를 만드는 회사들은 후자에 가깝고 전자의 경우는 방송 및 통신 인프라 기기를 만드는 알카텔, Cisco 등이 원천기술을 바탕으로 시장의 표준을 선도하고 성장하였다. 한국에 있는 대개의 스타트업들은 대부분 응용기술을 바탕으로 단말기 등을 사업자에게 납품하는 형태로 성장했다. 이러한 스타트업들은 대형 사업자를 잘 잡으면 갑자기 매출이 급신장하는 경향이 있다. 다만 원천기술보다는 응용기술로 승부하는 업체들이다 보니 사업자에 휘둘리고 갑자기 매출이 급격히 떨어질 수 있는 위험성을 가지고 있다.마지막 부류는 소비자 혹은 유저들이 직접 사용하는 완성품을 만드는 업체들이다. 완성품 형태로 제품이 나오기 때문에 소비자를 상대로 한 직접적인 마케팅 활동을 펼치는 경우가 많고 최근에는 하드웨어 단독으로 출시하기 보다는 SW와 서비스가 결합된 형태로 제품을 출시하는 경향이 강하다. 이런 부류의 스타트업들 중 가장 성공한 사례로는 모두가  잘 아는 애플이 있고 최근의 성공사례로는 액션 카메라의 원조 'GoPro', Wearable Fitness Band의 원조격인 'Fitbit'이 있다. 이러한 부류의 회사들은 브랜드를 구축하고 유통과 협력체제를 만들면서 직접 제품의 마케팅을 하는 경우가 많다. 예전에는 직접 공장을 짓고 제조까지 하는 사례가 많았지만 최근에는 위탁 생산을 하는 공장들이 워낙 많이 있기 때문에 공장을  짓기보다는 EMS 형태로 제조를 아웃 소싱하는 경우가 대부분이다. 이 부류는 기술도 중요하지만 시장의 니즈를 정확하게 파악하고 소비자에게 공감을 얻어 낼 수 있는 혁신을 만들어내는 것이 중요하다. 이 부류 중에서 일반 소비자들이 직접 체험할 수 있는 변화와 혁신의 모델을 만들어내는 혁신 기업이 나올 가능성이 크다.앞에서 설명한 4가지 종류의 하드웨어 스타트업 중에서 내가 가진 경험으로  이야기할 수 있는 부류는 마지막 부류이다. 난 삼성전자의 완성품 하드웨어 사업부인 VD (TV & Monitor) 사업부에서 소비자 대상의 완성품 하드웨어와 사업자 대상 하드웨어를 직접적으로 경험하고 많은 반도체 업체와 모듈업체를 Client 입장에서 만나보았다. 미국에서는 IPTV라는 아이템으로 STB와 HW 시스템을 업체와 같이 개발하고 납품받고 미디어 서비스 사업을 해보았다. 그리고 지금은 디지털 헬스케어 스타트업을 경영하면서 직간접적으로 4가지 부류의 하드웨어 스타트업들을 모두 경험해보았다. 하지만 그중에서도 직접적인 경험이 가장 큰 분야는 마지막 부류이다. 그렇기 때문에 마지막 부류에 대해서만 앞으로 이야기를 해보려고 한다.#NEOFECT #스타트업 #딜레마 #고민 #스타트업창업 #인사이트 #조언
조회수 2020

나는 이 조직의 문화다, 나는 이 조직의 성장하는 문화다

진저티프로젝트는 작년 하반기에 '밀레니얼 세대 연구'를 진행했습니다. 지금도 사회 곳곳에서 일하고 있으며 앞으로 리더가 될 세대, 그들은 어떻게 일하고 또 소통하는지에 대한 질문을 가지고 연구한 프로젝트였어요.그렇다면, 진저티프로젝트 안의 밀레니얼들은 어떻게 일하고 있을까요? '밀레니얼 세대 연구'의 연구원으로 합류하면서 진저티프로젝트에서 일을 시작한 Teatris Genius 빛나님이 진저티프로젝트 안에서 '밀레니얼'로서 바라본 조직의 모습에 대해 정리해보았습니다. 그리고 조직 안에서 일하면서 경험한 자신의 변화에 대해서도 얘기했습니다. <진저티프로젝트 밀레니얼의 성장기>라고 스스로 이름 붙인 빛나님의 글을 함께 보실까요?나는 이 조직의 문화다작년 여름, 나는 진저티프로젝트에 합류해서 함께 일하기 시작했다. 처음 진저티프로젝트에 들어왔을 때, 엄청나게 많은 질문들을 받았다. 어떤 이슈에 관심이 있는지, 어떤 삶을 살았는지, 어떤 일을 해보고 싶은지… 새로 직원이 들어왔다고 관심을 가져주시는 건가 싶었지만 많은 관심도 어쩔 줄 모르겠고 대답하기 어려운 부분도 많아지자 결국 브레이크를 걸고 이번에 내가 질문을 했다.“현선님, 원래 진저티는 이렇게 한 사람 한 사람에게 관심이 많나요? 회사에서 이렇게 질문을 많이 받고 의견을 많이 물어보시는 게 처음이라서요 허허”그랬더니 이런 답이 돌아왔다. 네! 저희가 궁금한 게 좀 많았죠? 저는 개인적으로 사람은 하나의 문화라고 생각해요. 그래서 새로운 사람이 한 명 들어오는 것이 새로운 문화가 들어오는 것과 같다고 느껴요. 그러면 기존의 문화도 적응이 필요하고 여러 문화가 함께 공존하기 위해 시간과 노력이 필요하다고 생각해요. 진저티는 지난 2년 동안 사람들이 바뀌고 환경이 바뀔 때마다 매번 바뀌어왔거든요. ‘사람을 문화라고 생각하는 사람이 있구나’ 정도로 기억했던 이 대화는 시간이 흐르고 새로운 사람들을 마주할 때마다 다시 생각하게 된다. 나라는 문화는 어떤 모습일까? 저 사람은 어떤 문화를 지닌 사람일까?나는 발전하는 문화이고 싶다돌이켜보면 지금 진저티프로젝트의 문화는 내가 처음 들어왔을 때와는 사뭇 다르다. 함께하는 사람들 사이에 변화도 있지만 그때의 나와 지금의 나도 많이 다르다. 사람을 문화라고 생각하는 우리의 문화는 고정되어있지 않고 유동적이다. 그래서 지금도 계속 변하고 새로이 만들어져가고 있다. 문화는 변화하고 그럼에도 불구하고 고유한 자기의 무언가를 가지고 있다. 이처럼 나도 건강한 문화, 완벽하진 않지만 시도하고 성장하는 문화가 되고 싶다. 또 나는 수많은 다른 문화 사이에서 나의 색을 오롯이 비출 수 있는 문화이고 싶다.  도대체 조직 안에서 이런 문화가 된다는 것이 가능하긴 할까?나의 성장과 모두의 성장이 가능한 문화나의 성장과 모두의 성장이 가능한 문화를 고민하던 중 사이다를 마시는 기분을 선사한 책을 발견했다. 이름하여 Everyone Culture>. 조직 구성원들의 역량을 높일 가장 강력한 방법은 개개인의 성장에 초점을 맞추는 것이라고 주장하는 이 책은 ‘의도적으로 직원의 성장을 끌어내는 조직문화’를 소개한다. 책에서는 성인 시기 성장에 대해 Mental Complexity(정신 성숙도)로 설명한다. 정신 성숙도는 3단계의 정신으로 구성되는데 첫 단계는 사회적 정신(socialized mind), 두 번째 단계는 자기통제 정신(self-authorized mind), 세 번째 단계는 자기변혁 정신(self-transforming mind)이다. 에서 소개하는 정신 성숙도 3단계사회적 정신은 ‘공동체 일원이 되어 활동해보는 경험’으로 자동차에 탑승한 상태로 비유된다. 소속감을 느끼며 정해진 가이드 내에서 활동하는 경험이자 정신을 뜻한다. 자기통제 정신은 리더가 되어 구성원을 이끌어본 경험을 의미한다. 문제를 해결하기 위한 시도들과 자신 고유의 방향과 방법들로 나아가는 정신을 뜻하며, 자동차를 직접 운전하는 상태로 비유된다. 마지막으로 자기변혁 정신은 어젠다와 계획은 세우지만 얼마든지 변경하고 확대할 여지를 가지고 있는 상태를 뜻한다. 자동차 운전자가 내비게이션을 가지고는 있으나 환경적 변화와 제공된 정보가 적절한지 계속 질문하면서 네비에서 가리키는 방향이 아닌 곳으로 얼마든지 새로운 길을 만들어가며 궁극적인 목표를 향해 나아가는 정신을 뜻한다.  책에서 소개하는 회사들은 회사 문화 안에서 구성원들을 자기변혁 정신의 단계로 이끌어낸다. Next Jump도 그런 회사 중 하나다. 스스로의 성장뿐 아니라 타인의 성장에 기여하는 것을 가장 중요한 문화로 꼽고 있으며, Better Me + Better You = Better US라는 슬로건에서도 그 문화를 확인할 수 있다.  Next Jump의 다양한 성장 지원 문화 중 가장 인상 깊었던 것은 백핸드 카드시스템이다. 백핸드 카드에는 운동선수들처럼 전 직원의 장단점(arrogant area and insecure area)이 서술되어 있고 이 정보는 모두에게 공유된다. 자신의 단점을 밝히는 것을 부끄러워하지 않고, 오히려 그 약점을 보강시킬 수 있는 업무와 환경을 제공하기 위해 애쓴다. 일례로 개발자로 오래 활동한 한 직원은 사람들 앞에서 발표하는 것을 어려워해서 매달 5분씩 전 직원 앞에서 그동안의 활동에 대해 발표하는 시간을 갖고 있다. ‘이런 회사가 또 있어?’하는 놀라움도 들었지만 더불어 ‘내 인생에서 가장 어려운 시기를 보내고 있다. 나를 성장시키기 위해 다른 사람의 피드백을 듣는 것은 정말 힘든 일이다’라는 생생한 언어들에 위로도 받았다. 자신의 색을 쨍하게 내기 위해서 정신 성숙도의 단계들을 거쳐볼 만하다. 이왕이면 다음 단계로 넘어가면서 말이다. 물론 단계에서 단계를 넘어갈 때 이전 단계에 머물고 싶은 충동이 커지고, 옳은 길을 가고 있는가 질문이 깊어질 수밖에 없을 것 같다. 그럼에도 내가, 또 나라는 문화가 더 발전하고 있다면 시도해볼 가치가 있지 않을까.  조직을 위해 억지로 성장하기보단 더 나은, 발전하는 사람들이 모여 조직이 더 성숙해져가는 사회라면 참여해볼 가치가 있지 않을까? 나는 <나 실험실>의 연구원이다나는 요즘 나의 가능성을 실험 중이다. 나라는 문화를 분해해보기도 하고, 이 문화의 장단점을 이곳저곳에서 실험해보고 있다. <나 실험실>에서 연구할 때는 집중력이 높아진다. 한껏 집중하는 입을 보시라!이 실험실을 함께 공유하는 진저 티 프로젝트 멤버들도 자신의 삶에서, 또 그 일부인 진저티 안에서 각자만의 다양한 실험을 하고 있다. 누군가는 이 공동체 안에 적응하는 실험을, 누군가는 자신만의 틀과 시도를 만들어가는 실험을, 또 누군가는 끝까지 질문하며 한 걸음 한 걸음 나아가는 시도를 하고 있다.  개개인의 실험뿐만 아니라 이 모든 개인을 포함시키는 진저티프로젝트의 실험도 주목할만하다. 모든 구성원이 서로 다른 단계의 실험을 하면서도 각자의 색을 쨍하게 내는 것, 다시 말해 다양한 경험과 문화 속에서도 서로 다른 목소리가 살아있게 하는 실험! 우리는 이 실험을 무지개 띄우기로 비유하곤 하는데 모두가 각자의 색을 쨍하게 내는 것이 실험의 성공이다. 닮은 듯하지만 이렇게나 고유의 색깔을 가지고 있는 진저티프로젝트 멤버들.나는 여전히, 엄청나게 좌충우돌하고 있다. 부서가 없는 조직에서 매번 다른 경험을 하고 있고, 새로운 시도는 끊임없이 계속된다. ‘이게 맞나?’하는 생각이 들 때마다 문득 겁이 나거나 주저할 때도 생긴다. 그럼에도 이건 실험이니까, 나를 알아가고 나다워지는 과정이니까 하며 스스로를 다독이고 있다. 언젠가 나의 현재 색깔에 대해 조금 더 구체적으로 공유할 날이 오기를, 또 그때의 진저티 무지개에 대해 설명할 수 있기를 기대해본다.#진저티프로젝트 #조직문화 #기업문화 #사내문화 #인사이트
조회수 1324

[인공지능 in IT] 인사가 만사다

기술기업으로 인재의 중요성은 거듭 강조해도 지나치지 않다. 특히, 요즘처럼 어디에나 인공지능이 적용되는 시점에 넓은 인공지능 전문가 풀을 보유하는 것은 강력한 무기다. 2000년대초까지만 해도 대한민국은 전세계가 부러워하는 IT 강국으로 위상을 떨쳤지만, 현재 상황은 많이 달라졌다. IT 인재에 대한 편견뿐만 아니라 경쟁력을 상실한 처우 등 여러 악조건 등으로 경쟁 국가에 비해 조금씩 뒤쳐지고 있는 상황이다.필자가 속해있는 스켈터랩스의 상황을 빌려 기술 기업의 인재에 대해 설명해보자. 스켈터랩스의 미션은 'To innovate machine intelligence for understanding, assisting and improving daily lives anywhere and anytime'으로, 번역하자면 '언제 어디서나 우리의 일상을 이해하고, 도와주고, 더 나아지게 하는 머신 인텔리전스의 혁신을 이룬다'이다.스켈터랩스는 인공지능 기술을 개발하는 회사지만, 중심은 결국 인간이라는 뜻이다. 자고로 기술 기업, 특히 인공지능에 주력하는 기업은 인간을 위한 기술을 개발하기 위해 인재를 모으고, 팀마다 다양한 배경의 재능있는 멤버로 구성한다. 인간의 지능을 근간으로 인간을 위한 기술을 개발하는 데에 주력해야 하기 때문이다. 다시 말해, 우리는 모두의 삶의 질을 향상시킬 수 있는 기술을 개발할 수 있는 인재의 중요성에 대해 깊이 자각해야 한다는 것이다.< 스켈터랩스 >경영인들에게 가장 귀감이 되는 인물을 꼽으라면, 많은 사람이 GE의 잭 웰치 前 회장을 거론한다. GE를 세계적인 기업으로 탈바꿈시킨 잭 웰치의 경영 방식 중심은, 단연코 인재 관리다. 회장으로 취임할 당시 '고쳐라, 매각하라, 아니면 폐쇄하라'라는 본인의 철학을 필두로, 퇴임을 앞두기 직전까지 인재의 중요성을 강요했다. 퇴임할 당시 잭 웰치는 인재를 통한 4가지 주요 전략을 발표했는데, 첫째로 GE의 세계화 전략은 곧 인적 자산의 세계화라는 것이며, 둘째로 지식과 학습을 통한 서비스 전략 창출, 셋째로 6시그마 전략의 도입, 마지막으로 리더를 위한 e비즈니스의 도입이었다. 전설적인 경영인으로서, 위기를 성공으로 탈바꿈하는 기업인으로서 잭 웰치의 업적이 입에 오고 내리는 이유는 그가 인재 육성의 가치를 경영과 직접 연계시켰기 때문이다. 본인 업무의 70%는 인재에 쓴다고 했을 정도다. 훌륭한 기업으로 성장하기 위해서 그만큼 사람이 재산이라는 것을 일찍이 깨달은 것이다.< GE>수 년전부터 4차산업혁명, IoT 그리고 현재의 인공지능까지 IT 기술은 비약적으로 발전함했다. 이에 기업의 모든 전략은 '얼마나 빠르게 신기술을 도입할 수 있는가', '당장 적용할 수 있는 기술은 무엇인가', '신기술을 통해 얼마나 비용을 절감할 수 있을 것인가' 등 기술 자체에 과하게 집중되어 있다. 그러나 새로운 기술을 개발하는 주체는 누구인지, 어떤 것을 위해 집약적인 노동력을 동원하고 있는지 다시 한번 생각해봐야 한다. 스스로 학습하고 문제를 해결해나갈 수 있을 것이라는 인공지능이라는 기술 역시 결국에는 'Artificial Intelligence', 인간이 만들어내는 지능이다. 이토록 인재에 대해 신경을 써야 하는 이유다.잭 웰치의 어록 중에 이런 말이 있다. 'People First, Strategy Second'다. 전략보다 사람을 우선한다는 이 말처럼 뛰어난 기업으로 발돋움하기 위해서는 사람이 중심이어야 하고, 기술 기업에 있어 사람에 대한 가치는 그만큼 중요하다. 어떤 프로젝트를 진행하느냐와 상관없이 인공지능 기술을 개발하는 길목에는 항상 뛰어난 인재가 함께 해야 할 것이고, 이를 통해 인간을 위한 진정한 인공지능을 구현하는 것이 사명일 것이다.이호진, 스켈터랩스 마케팅 매니저조원규 전 구글코리아 R&D총괄 사장을 주축으로 구글, 삼성, 카이스트 AI 랩 출신들로 구성된 인공지능 기술 기업 스켈터랩스에서 마케팅을 담당하고 있다#스켈터랩스 #기업문화 #인사이트 #경험공유 #조직문화 #인공지능기업 #기술기업 #HR #인재의중요성
조회수 1481

Navigation Controller 자유롭게 다루기

Intro: The Navigation Controller예고했던 Navigation Controller와 TabBar Controller의 커스터마이즈 중, Navigation Controller의 구조와 간단한 커스텀 방법을 나누겠습니다. Navigation Controller(이하 내비게이션 컨트롤러)는 거의 모든 iOS 앱에서 사용된다고 해도 과언이 아닌 자주 사용되며, 간결하지만 막강한 기능을 가진 컨트롤러입니다. 앞선 글에서 소개했듯, TabBar Controller와 함께 iOS의 양대 컨트롤러라고 불러도 대부분의 iOS 개발자들이 동의하리라고 생각합니다. 이번 글에서는 내비게이션 컨트롤러를 커스텀하는 방법을 소개하겠습니다.Navigation Cotroller (출처: apple developer)목차1. Push, Pop 애니메이션 커스터마이징2. Pop 제스처 사용하기, 사용하지 않기3. Back 버튼 타이틀 숨기기4. 상단 좌우의 버튼 추가하기5. NavigationBar 숨기기, 보여주기6. What’s NEXT?1. Push, Pop 애니메이션 커스터마이징Push, Pop 트랜지션 기능은 내비게이션 컨트롤러의 핵심적인 기능입니다. Stack에 다음 View Controller를 쌓으며 디스플레이하는 것이 Push, 이전의 View Controller로 되돌아가는 것이 Pop 액션입니다. Pop 액션에는 최초에 디스플레이됐던 View Controller로 돌아가는 Pop to Root 액션이 포함되어 있습니다.<iframe width="560" height="315" src="https://www.youtube.com/embed/NqfYhI5ySKk" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="">Pop View Controller(animated)이러한 액션에는 애니메이션이 포함됩니다. 대개 기본적으로 적용된 애니메이션을 사용하면 되지만, 어떤 이유로 애니메이션을 커스텀하고 싶은 경우가 생깁니다. 이럴 때는 UINavigationController를 상속하는 커스텀 클래스를 만들어서 커스텀할 수 있습니다. 물론 Extension 형식으로 함수를 작성할 수도 있습니다.// UINavigationController를 상속하는 커스텀 클래스를 작성 class BRNavigationController: UINavigationController { // 애니메이션을 적용하는 함수를 작성 func overrideAnimation() { //여기에서 커스텀 애니메이션을 작성합니다. let transition = CATransition() transition.duration = 0.3 transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) transition.type = kCATransitionFade self.view.layer.add(transition, forKey: nil) } // popToRootViewController(animted)를 오버라이드 override func popToRootViewController(animated: Bool) -> [UIViewController]? { print("Custom Animation Triggered") if(viewControllers.last!.isKind(of: PersonalViewController.self)) { // 커스텀 애니메이션을 사용할 ViewController의 케이스를 분기한다 // 작성된 커스텀 애니메이션 트리거 self.overrideAnimation() //UINaivgationController의 Function을 그대로 반환 return super.popToRootViewController(animated: false) } else { // 다른 모든 케이스의 경우 디폴트 애니메이션을 사용 //UINavigationController의 Function을 그대로 반환 return super.popToRootViewController(animated: animated) } } } 위의 코드로 작성한 애니메이션 아래의 영상과 같이 동작합니다.<iframe width="560" height="315" src="https://www.youtube.com/embed/g_XCo1Hmnj0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="">커스텀 Pop 애니메이션이 적용된 Navigation Controller위와 같이 커스텀된 내비게이션 컨트롤러는, 단지 애니메이션을 오버라이드하는 데 그치지 않고 다양한 방식의 효율적 코드 작성을 할 수 있게 합니다. 우리가 아는 것처럼, 수퍼클래스의 위용과 유용을 마음껏 누릴 수 있습니다.2. Pop 제스처 사용하기, 사용하지 않기내비게이션 컨트롤러에서는 화면 왼쪽 끝에서 오른쪽으로 스와이프하는 Pop 제스처를 사용해 이전 View Controller로 돌아갈 수 있습니다. 하지만 종방향 스크롤이나 스와이프 이벤트를 사용하는 ViewController의 경우 어쩔 수 없이 Pop 제스처를 막아야 하는 일이 생깁니다. 이럴 때에는 해당하는 ViewController에서 다음과 같이 간단한 코드로 Pop 제스처를 방지하거나, 방지 해제할 수 있습니다.// 아래의 코드를 트리거하면 Pop 제스처를 비활성화할 수 있습니다 self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false 이 코드를 한 번 적용하면, 해당 내비게이션 컨트롤러의 Stack에 쌓인(또는 쌓일) View Controller에 일괄적으로 적용되기 때문에 반드시 다른 ViewController에서는 기본적으로 isEnabeld를 True값으로 지정하도록 코드를 구성하여 모든 ViewController에 일괄적용되는 것을 방지해야 합니다.다만 이 부분에서 중요한 것은, Back 버튼을 숨기거나 커스텀할 때 각별히 주의해야 한다는 것입니다. 제스처를 사용하는 사용자들도 있지만, 제스처의 존재 자체를 모르는 사용자들도 있기 때문에 Back 버튼은 대부분의 경우 유지하는 것이 좋습니다. 제스처를 비활성화할 때는 더더욱 유지해야 하고요.Back Button이 없다면 어떻게 뒤로 돌아갈 수 있을까요.3. Back 버튼의 타이틀 숨기기내비게이션 컨트롤러에 포함된 Navigation Bar(이하 내비게이션 바)의 Back 버튼은 자동으로 이전 ViewController의 타이틀을 보여주도록 디폴트 설정되어 있습니다. 이렇게 자동지정된 타이틀이 마음에 들지 않는다면, 간단한 트릭을 사용하여 타이틀을 없앨 수 있습니다.먼저, Back 버튼의 타이틀이 되는 이전 ViewController의 타이틀은 ViewController에서 다음과 같이 지정됩니다.// 직접 ViewController의 타이틀을 지정 viewController.title = "이것이 바로 타이틀입니다" Back Button에 '상품정보' 타이틀이 보입니다.위의 코드로 지정한 ViewController의 타이틀은 Push 액션을 통해 다음 ViewController로 넘어갔을 때 Back 버튼의 타이틀로 사용됩니다. 그래서 이 코드를 사용하지 않고, 커스텀 Label을 titleView에 넣어주는 것으로 대신할 수 있습니다.// titleView로 사용할 Label을 생성 let label = UILabel(frame: customFrame) label.text = "이것을 타이틀로 사용합니다" // viewController의 titleView를 생성한 Label로 셋업 viewController.titleView = label 짜잔- Back Button의 타이틀이 사라졌습니다!4. 상단 좌우 버튼 추가하기여러 iOS 앱들을 사용하다 보면, 내비게이션 바의 좌/우측단에 위치한 버튼들을 자주 보게 됩니다. 이 버튼들은 BarButtons(이하 내비게이션 바 버튼) 라고 불리우는 컴포넌트들입니다. 내비게이션 바 버튼들은 배열 방식으로 좌/우측에 각각 배치됩니다. 원하는 이미지와 텍스트 등으로 내비게이션 바 버튼을 생성한 후, 좌/우측의 버튼 배열 중 원하는 곳에 각각 넣어주면 디스플레이 되는 방식입니다. 다음의 코드 예제를 통해 내비게이션 바 버튼을 추가할 수 있습니다.// RightBarButtons에 추가할 UIBarButtonItem을 생성 let customButton = UIBarButtonItem(customView: customView) // Container가 될 Array를 생성 (혹은 직접 지정하는 방법도 있습니다) let rightBarButtons: [UIBarButtonItem] = [] // Array에 버튼 아이템을 추가 rightBarButtons.append(customButton) // RightBarButtonItems 배열을 셋업 viewController.navigationItem.rightBarButtonItems = rightBarButtons //LeftBarButtons에 추가할 UIBarButtonItem을 생성 let customButtonCopy = UIBarButtonItem(customView: customView) // Container가 될 Array를 생성 (혹은 직접 지정하는 방법도 있습니다) let leftBarButtons: [UIBarButtonItem] = [] // Array에 버튼 아이템을 추가 leftBarButtons.append(customButtonCopy) // LeftBarButtonItems 배열을 셋업 viewController.navigationItem.leftBarButtonItems = leftBarButtons 타이틀뷰, LeftBarButton, RightBarButton이 모두 커스텀된 브랜디의 홈5. NavigationBar 숨기기, 보여주기앱의 UI가 전체화면으로 컨텐츠를 표시해야 할 때, 또는 다른 목적에 의해서 내비게이션 바를 숨기거나 보여주어야 할 때가 있습니다. 이럴 때는 간단한 코드 트리거로 내비게이션 바를 숨기거나 보여줄 수 있습니다.// 단 한 줄의 코드로 내비게이션 바를 숨길 수 있다구요? navigationController.setNavigationBarHidden(false, animated: true) <iframe width="560" height="315" src="https://www.youtube.com/embed/ldpe-M8Uyy8" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="">내비게이션바를 숨겼다가 보였다가6. What’s NEXT?현재 앱스토어에 배포된 브랜디 iOS 앱은 내비게이션 컨트롤러를 적극적으로 활용하여 작성되었습니다. 내비게이션 컨트롤러는 기본 설정으로 사용할 때에도 여전히 막강한 특징들을 많이 가지고 있기 때문에, 선택적으로 알아두어야 할 컴포넌트가 아닌 필수적으로 그 장단점과 용법을 꿰고 있어야 하는 중요한 컴포넌트입니다. 내비게이션 컨트롤러만 잘 다루어도 앱을 개발할 때 굉장히 도움을 많이 받을 수 있다는 것이죠.내비게이션 컨트롤러는 다양한 방식으로 커스터마이즈를 할 수도 있습니다. 물론 이러한 커스터마이즈는 필수사항은 아닙니다. 디자인적 요소를 적용하기 위해 커스터마이즈하는 경우가 대부분이지만, 그에 못지 않게 개발자가 프로젝트의 컴포넌트를 정규화하고 모듈화하기 위해 커스텀하는 경우도 많은 만큼 StackOverflow나 애플 개발자 문서를 참고해 다양한 커스터마이즈를 해보는 것도 재미있을 겁니다.다음 글에서는 TabBar Controller의 커스터마이즈 방식에 대해 간략하게 공유하겠습니다. iOS 루키들의 장수와 번영을 바라며, 글을 마칩니다. Live long and prosper!참고UINavigationController - UIKit | Apple Developer Documentation글이정환 과장 | R&D 개발MA팀[email protected]브랜디, 오직 예쁜 옷만
조회수 2324

개발자에게 필요한 좋은 개발도구들

안녕하세요. 크몽 개발팀 입니다~ 개발자는 무엇인가 개발하기 전에 준비해야될게 있습니다. 바로 개발도구들 과 자신에게 잘 맞는 셋팅이 필요하죠.그래서 이번에 개발환경을 셋팅하면서 알게 된 정보를 공유하기위해 이번 포스트를 작성하게 되었습니다.첫번째 개발도구는 'ampps' 입니다.  ampps는 개발에 있어서 필요한 다양한 개발도구들을 제공해주고 있는데요. 정석대로 하나씩 개발도구들을 설치하게 된다면 많은 시간을 투자해서 설치 및 셋팅을 해야하지만ampps는 한번의 설치만으로 Apache, MySQL, PHP, Python, MongoDB 등등 기본적인 셋팅을 통해 초보개발자이더라도 쉽고 편리하게 사용할 수 있다는점이 가장 큰 장점이라고 생각하고 있습니다.지원되는 운영체제는 Windows, Mac, Linux 모두 지원하기때문에 어느 운영체제는 지원이 안되는 불편함은 없겠네요.사이트 :http://www.ampps.com/ 두번째 개발도구는 'WebStorm' 입니다.  WebStorm은 비쥬얼스튜디오나 이클립스와 같은 통합 개발환경을 제공하고 있습니다.그리고 현재 자바스크립트 프로그래밍에서 절대적인 최고의 에디터로 개발자 사이에서 유명하고 많은 개발자들이 사용하여 개발하고 있습니다. WebStorm의 좋은점은 작성한 코드에서 에러가 있다면 JSHint가 에러부분 밑에 워드프로세서 철자법검사기처럼 빨간 줄로 에러를 표시해 주기때문에 개발자의 실수들을 바로 잡아줄 수 있어서 정말 좋습니다. 그러나 사용자는 30일 평가기간이 끝나면 추가비용을 지불해야 사용할 수 있는데요. 비용을 지불할 만큼 좋은 에디터인점은 변함이 없습니다.  사이트 : https://www.jetbrains.com/webstorm/  앞으로도 공유할 정보들이 생길때마다 크몽팀 블로그에 업데이트 할 예정입니다.포스트 내용에서 찾으시는 정보들을 찾으셨으면 좋겠고 크몽팀 개발자이야기에 많은 관심 부탁드립니다. :)이상 포스트를 마치겠습니다. #크몽 #개발팀 #인턴 #인턴생활 #경험공유
조회수 699

아는만큼 들린다

최근 본 SF영화 컨택트는 난해하면서도 매우 신선했다.이 영화는 시간과 언어에 대한 철학적 질문을 '외계인'을 통해 전달한 꽤 새로운 방식의 영화였고, 최근 고민하고 있던 '소통'의 문제를 다루고 있어서 내겐 더욱 인상적이었다.그러고보니,우리 주변에 '외계인'들이 보이기 시작했다.비록 유사한 모습을 하고 있지만, 서로 다른 이야기를 자기 방식대로 하고, 서로의 말을 이해하려 하지 않는 그런 경우, 외계인으로 의심해봐도 될 것 같다는 엉뚱한 생각이 든 것이다.웃기지만, 우습지 않은 이야기이고,'그 분'이 생각났을 수도 있겠지만, 아니다. 우리 모두의 이야기이다.미쓰커뮤니케이션오랜 조직생활에서 실제 경험했던, 그리고 많은 사람들이 동일하게 호소하는 가장 어려운 부분이 '의사소통의 어려움'이다. 언어가 다르거나, 단어를 이해하지 못하는 것도 아닌데 우리는 여전히 대화가 어렵고, 대화의 70%는 오류 투성이다.(실제로 화자가 전달하려는 말의 30% 정도만 정확하게 전달된다고 한다. 나머지는 추측, 오해, 다른 뉘앙스로 해석) 똑같은 회의를 하고 나왔음에도, 각자 해석하는 것이 다르고, 해석의 해석을 위한 또 다른 회의가 벌어지는게 비일비재하다. 더군다나 창의력과 상상력을 발휘해야 하는 분야이거나, 아직 실체 조차 없는 아이디어를 서로 공감시키고 발전시켜야 하는 업무를 하는 사람들은 더 설명하지 않아도 그 혼란스러움과 시행착오는 충분히 예상이 되는 바이다.영화 '컨택트'에서 내게 인상적이었던 장면은 최초의 질문을('지구에 어떤 목적으로 왔는가?') 어떤 방식으로 '외계인'에게 이해시킬 수 있을까에 대한 과정이었다. 전혀 이해하지 못하는 인간과 외계인의 언어를 통해, 인간의 질문 의도를  어떻게 이해시킬 것이며, 외계인의 대답을 어떻게 해석할 수 있을 것인가에 대한 2가지 과정이 영화의 상당한 부분을 차지 하고 있었다. 정확히 이 부분을 이해하려면 영화를 몇 차례 더 봐야 할 정도로 명쾌하게 이해되진 않았지만(음... 이해력이 많이 딸린다 -_-;), 내게 중요하게 느껴졌던 것은 결국 질문을 통해서 생각을 소통해간다는 관점이었다.질문이 어색한 문화내가 새로운 일을 시작할 때 쓰는 나만의 방법이 있다.스스로에게 질문지를 작성하는 것이다. "왜 이 일이 정말 필요할까?""이 일에서 가장 중요한 핵심이 무엇일까?""이 문제를 해결하려면 무엇이 필요할까?""이 일을 과거에 어떻게 처리했고, 그 방법이 여전히 도움이 될까?"...등등일의 유형에 따라 내게 스스로 던지는 질문의 형태는 각기 다르지만, 처음에는 매우 원론적인 질문을 통해 스스로 일에 대한 명분과 의도를 확실하게 해 두는 것이 내겐 매우 중요하다. 그래야 일에 대한 목표와 확신을 갖게 되는 것 같다. 이러한 질문은 실제 상당히 유용하게 활용되며, 일을 효과적으로 처리하는 좋은 습관이 되었다.스스로에게 하는 질문이 정리되면, 그 다음에는 이 일을 같이 하는 사람들에게 질문을 던진다. 그것이 내 상사일 수도 있으며, 나의 동료나 후배 팀원일 수도 있다. 위 아래 상관없이 같이 공유할 수 있는 질문을 만들어서 그 질문의 의도를 공감시키고, 그 문제를 바라보는 관점을 동일하게 만드는 것은 매우 중요한 과정이다. 대부분의 협력에서 생기는 오류는 서로 일을 이해하는 관점과 지향하는 목표가 다르기 때문이다라고 나는 생각한다. 동일한 팀에게 같은 질문을 던지는 순간 그 질문을 통해 이 일을 바라보는 다양한 관점을 좁혀갈 수 있으며, 최소한 무엇이 어떻게 다른지에 대해서 이해할 수 있게 된다.경험 많은 꼰대다음 단계는, 같은 방향으로 답을 찾아가는 과정이다.이 단계는 경험과 전문성이 매우 중요하다.안타까운 것은, 많은 직장인들이 연차가 쌓이고 경험이 늘어나고 일이 익숙해지면, 소위 '꼰대'가 되어 간다는 사실이다.솔직히 꼰대라는 것은 상대적인 것이라, 대학원생도 학부생에겐 꼰대가 될 수 있으며, 대리도 사원에게는 동일한 취급을 받을 수 있다. 이 땅의 많은 부장님들은 말할 것도 없이, 경험이 쌓이고 자신만의 노하우가 축적될 수록 누군가에겐 꼰대로 비하되는 정서가 최근엔 상당히 퍼져 있는게 사실이다.자신만의 성공방식을 남에게 강요하고, 자신의 방식만이 옳다고 생각하는 전형적인 꼰대들의 행태는 같이 일하는 사람들에게는 매우 곤혹스러운 일일 뿐만 아니라, 더욱이 과거의 방식이 더 이상 유효하지 않는 오늘날의 거대 산업 패러다임 하에서는 자칫 매우 위험할 수 있다.반면에, 성공의 경험이건, 실패의 경험이건,경험이라는 것은 그냥 함부로 치부해버릴 만한 것은 아니다.그 경험을 어떻게 활용하느냐가 핵심이지, 꼰대들의 경험일지라도 그 안에 중요한 인사이트가 있다는 것을 존중해줄 필요가 있다. 물론 꼰대의 행동방식이어서는 곤란하겠지만...어설픈 경험의 오류사실 더 무서운 것은, 어설픈 경험과 무지의 폐단이다.최근 직급을 파괴하고, 수평적 조직문화를 만들기 위한 시도를 다양하게 찾아볼 수 있다.호칭을 바꾸고, 복잡한 의사결정 단계를 줄이고, 누구라도 의사를 존중해주기 위한 장치들이 고안되고 실행되고 있다. 아마 직장인들이라면 최근 이런 변화를 조금씩 경험하고 있을 것이라고 생각한다.매우 의미있는 시도이다. 그리고 그 효과를 분명 보게 될 것이다.하지만, 우리가 오해하지 말아야 할 것이 있다.수평조직의 의미를 잘 이해해야 한다.계급장 떼고 서로 맞먹자는 것이 수평조직이 추구하는 것이 아니다.그동안 일반적인 조직형태였던 수직 구조의 조직은 사원, 대리가 아무리 좋은 아이디어와 기획안을 가지고 있더라도, 허드렛일만 하게되거나, 의견을 개진 하더라도 그것을 과장, 부장님들을 거치는 과정에서 좋은 기획 의도와 취지가 변색되거나 전혀 다른 방향으로 전달되는 경우가 많았었다. 가장 신세대이며 가장 최신의 지식으로 무장하고 아마도 가장 많이 공부한 사람들이 그들일진데, 그 길이 막혀있었던 것이다. 그것을 해소하기 위해, 보고의 레이어(layer)를 줄이고 신선한 아이디어를 검토 단계에서 동등하게 올리자는 것이 수평조직의 취지라고 나는 이해한다. 그래야, 과장, 차장의 아이디어와 사원, 대리의 아이디어가 본래의 의도대로 충분히 검토될 자격을 주어질 수 있게 되기 때문이다.그러나, 수평조직 도입 과정에서 오해가 발생하는 부분은, 의사결정 부분이다.조직에서 의사결정은 철학의 문제이다. 사원과 대리의 철학, 부장과 임원의 철학이 각각 개개인별로 다를텐데, 이 부분을 논쟁과 다수결로, 그리고 동일한 가중치로 요구하는 경우가 발생하곤 한다. 이것은 아이디어와는 다른 문제이다.그래서 훌륭한 리더가 중요한 것이다.더닝크루거 효과 모든 사람의 의견을 경청해야 하고 존중해야 하는 시대이다.무지는 지식보다 더 확신을 가지게 한다. -찰스 다윈-벼는 익을수록 고개를 숙인다는 말이 있다.정말 많이 알게 될수록, 자신이 모르는게 더 많다는 생각이 점점 커진다고 한다.서울 안가본 사람이 가본 사람을 이긴다는 말도 있다.아주 조금의 지식과 경험을 가진 자들이 환영적 우월감에 사로잡혀 자신의 실력을 턱없이 높게 평가하여 극도의 자신감을 표출하는 현상을 '더닝크루거 효과(Dunning-Kruger Effect)'라고 한다.코넬대학의 사회심리학 교수인 데이비드 더닝(David Dunning)과 당시 대학원생 저스틴 크루거(Justin Krugger)가 밝힌 이 현상은, 자신의 어설픈 경험에 기반한 과대한 우월감으로 다른 사람의 진정한 능력을 알아보지 못하고, 자신의 실수를 알아차리지 못하는 상황을 이론적으로 잘 설명해주고 있다.Stay Humble, Stay Focused언어는 우리의 사고를 좌우하는 가장 중대한 프레임이다.언어는 우리가 살아가면서 세상과 교류하는 가장 중요한 툴이기도 하다.동일한 언어이지만, 같은 방식으로 소통되지 않고,같은 의도로 전달하지만, 전혀 다르게 받아들여지는 이유는 너무나도 많다.아는 만큼 들리고,생각한 만큼 이해할 수 있다.겸손하고 진중해야 할 것이다.
조회수 88

[바로고 복지문화] 문화생활 즐겨찾기 잠실구장 야구 관람

[바로고 공식 홈페이지]출근이 즐거워지는바로고의 복지 문화13가지"바로고의 임직원들은 출근이 즐겁습니다."복지문화 13가지가바로고의 생활을 더욱 즐겁게한층 더 나은 직장생활을 하게 하는원동력이 되기 때문이죠.바로고 복지문화지적인 삶을 위한문화생활 즐겨찾기매월 마지막 주 수요일이면문화의 날을 그냥 지나칠 수 없어요~지난 9월에는 스포츠 관람을 했답니다.바로 인기 절정의 야구 관람!잠실구장 방문~ 그 생생한 현장을 공개합니다^^가을 하늘과 함께멋진 잠실구장사업총괄본부 & 전략기획본부지난 9월 13일함께 롯데:LG 의 경기를 관람했습니다.우와~ 잠실구장에서 보는 뷰는정말 멋진 거 같아요!탁- 트인 뷰가 업무의 스트레스까지 날려버리는 듯한 기분!경기가 시작되는 6:30이 지나니해가 지기 시작했어요.오랜만에 노을도 볼 수 있어서 좋았어요.야구장에서 빠질 수 없는맥주!평소보다 더 시원하고 느껴지는 건기분 탓일까요^^왠지 야구장에서 마시는 맥주가젤루- 맛있는 거 같아요~바로고 x KFC바로고의 제휴사 KFC의 징거버거를 먹으며야구 관람을 했습니다.KFC의 치킨은 순식간에 사라져서촬영을 하지 못했네요.퇴근 후 바로 야구장으로 가서넘나 배가 고팠답니다. ㅜㅜ경기가 이어지며어느새 어둑어둑이날 경기는 롯데에서 투수 레일리LG에서는 투수 소사와 맞대결을 펼쳤어요.경기는 3:1로 LG 승!저희는 3루 쪽에 앉았지만LG 두산 롯데 삼성 등다양한 구단별 팬층을 보유하고 있어서경기 결과보다는 '야구 관람'에 의미를 두고^^아주 즐거운 시간을 보냈습니다.빠질 수 없는 기념사진인증샷!KFC이 징거버거를 맛있게 먹으며셀카로 찰칵!야구를 보는 재미의 묘미는 홈런인데ㅠ안타나 홈런이 더 많이 나왔으면 좋았을 텐데생각보다 점수가 나지 않아서 아쉬웠어요.잠실구장에서문화생활 즐겨찾기!마지막으로 단체샷으로 마무리하며야구 관람을 마칩니다.이렇게 보니 관중석 가득정말 많은 야구팬들이 오셨네요~뜨거운 열기의 현장이었어요.야구는 역시 직관이 최고!야구 관람 현장마지막으로 더하기+저희가 야구 관람을 하면서 먹은먹방의 흔적들~이렇게 많은 양을 과연 다 먹은 걸까요?야구장에서 먹으면 더욱 맛있는 치킨, 햄버거 등등어마어마한 쓰레기의 양에 살짝 놀랐습니다^^그래도 뒷정리는 깨끗하게!다음은 어떤 문화생활이 기다리고 있을까요?바로고에만 있는 복지문화다음을 기대해주세요!대한민국 대표#배달 #배달대행바로고[바로고 배달대행 문의]전화02-550-9938메일[email protected]홈페이지 제휴 신청https://goo.gl/vQpLpF
조회수 643

고객에서 팬으로...

최근 중국발 미세먼지를 해결할 수 있는 기발한 아이디어가 등장했다.중국발 미세먼지로 인해 한국의 아이돌 그룹 EXO의 건강에 위협을 주고 있다는 이야기를 중국 EXO 팬들에게 알려주면, 대한민국 정부도 해결하지 못하는 이 문제를 중국 EXO 팬들이 해결할 것이라는 기막힌 발상이다.웃자고 하는 얘기지만,이미 우리들은 시장에서 '팬'들의 열정과 영향력을 충분히 알고 있다.팬은 상품의 일부이다그들은 단순히 상품 또는 서비스를 소비하는 고객이 아니다.그들은 상품의 일부가 되어 유기체적 역할을 하게 된다.스스로 광고 매체가 되고스스로 차기 아이디어의 원천이 되기도 하고상품의 존속을 결정짓는 핵심 의사결정자가 되기도 한다.하지만, 고객을 아무리 '왕'으로 섬긴다고 '팬'이 되지는 않는다.고객은 '만족'을 취하지만, 팬은 '감동'으로 움직인다.고객은 '만족', 팬은 '감동'필요나 기대를 멋지게 충족해준다면, 고객은 '만족' 할 수 있다. 문제는 모든 경쟁자가 '뻔~한 기대'만을 바라보고 유사한 수준의 만족을 제공하기 위해 혈투를 벌이고 있다는 것이다.남들과 같은 수준으로는 팬덤을 형성할 수 없다.말은 쉽지만, 기업들은 '고객 만족'조차 달성하기 녹녹치 않은게 현실이다.기업들이 '소비자 조사, User Friendly, 사용자 중심, 고객 최우선' 등의 모토를 내세우며 고객 만족도를 높이기 위해 고군분투 하고 있지만, 고객을 들여다보면 볼수록 아이러니하게도 '감동'은 멀어져가게 된다.만족의 연장선상에 감동이 위치하고 있지 않기 때문이다.고객의 기대치를 200% 달성한다면, 만족이 '대만족'은 될 수 있을지 몰라도, 그것이 '감동'이 될 수는 없다. 더 만족한다고 팬이 만들어지지 않는다는 얘기다.대만족과 감동은 다르다그렇다면 '감동'은 어떻게 만들어질 수 있는가?감동을 만드는 레시피가 있다면 좋겠지만, 사실 어려운 얘기다.다만, 팁이 있다면,고객이 전혀 예측하지 않았던 부분에서 뜻밖의 행복감을 줘야한다는 것이다. 감동은 만족의 강도뿐만 아니라, 전혀 기대하지 않았던 부분에서의 뜻밖의 만족감에서 발현된다.그리고, 그것을 지속적으로 보여줄 수 있어야 한다.애플이 오랫동안 그러했고,마이클잭슨이 그러했고,나이키 에어조던이 그러했다.최근 '윤식당'의 나영석 PD가 그러하고,또 다시 기대되는 '응답하라'시리즈가 그러하다.모두 자기 칼라가 분명했고, 지속적이었고, 최고였다.남들과 다르게 최고를 만들기이미 경쟁자가 있었지만,누구도 시도하지 않았던 자신만의 방식으로기대치 않았던 행복감을 주었다면 나는 기꺼이 그들의 팬이 될 의향이 있다.현재 고객의 만족을 염두에 두고 고심하고 있다면,한편으로 어떻게 고객을 팬으로 만들 수 있을지 고민해 볼 필요가 있다.남들과 다른 관점으로,남들이 미처 생각하지 못했던 방식으로,Originality를 찾아야 한다.'Good to Great' 만으로는 이제 어렵다.'Universal to Unique'가 되어야 한다.Universal to Unique만일 지금 누군가의 팬이거나,어떤 브랜드 또는 상품의 팬이라면,자신이 무엇때문에 팬이 되었는지 생각해보고팬덤을 만들기 위한 자신만의 레시피를 고민해보자.전혀 다른 접근방식이 떠오를 것이다.팬들이 하나둘 생길 것이다.고객에서 팬으로...

기업문화 엿볼 때, 더팀스

로그인

/