반응형

R&R을 뛰어 넘어라

 

기업이 커지면 커질수록 분란의 싹이 함께 커집니다. 스타트업일 때는 동료들이 이일 저일 미루지 않고 함께 하지만, 조직이 커지면 위계질서가 만들어지고, 역할 분장이 명료해집니다. 드디어 직원들에겐 R&R(Role & Responsibility)이 부여됩니다. "이것은 네 일, 저것은 내 일" 하지만 기업은 늘 신사업을 찾다보니 갈등이 벌어집니다. 리더가 R&R을 매번 바꿔 줘야 하지만, 현실은 그렇지 못하니까요. 예를 들어,

 

  • 👩옆 팀장: 좀 도와줄 수 있나요? 우리 팀에서 새 업무를 아는 사람이 없는데
  • 🤫: 할 수 있을 것 같은데요. 일단 저희 팀장께 물어보고 답변 드릴게요.
  • 👦내 팀장: 책임님이 옆 팀 일을 거드시면 저희 팀 업무는 언제 하시려고요.
  • 😟: (어떻게 해야하지...ㅠㅠ)

 

R&R  

이러한 R&R을 도입한 것은 1920년대 제너럴 일렉트릭(GE)으로 알려졌어요. 당시 CEO인 앨프레드 P. 슬로언이 조직 개편을 주도하면서 각 부서와 직위에 따른 R&R을 정립했습니다. 업무 범위를 명확히 하고, 책임 한계를 설정했어요. 당시에는 파격이었습니다. 부서장이 내리는 업무외적 불필요한 명령을 차단하고, 회사 존립 목적 자체에 집중하도록 했기 때문인데요.

 

하지만 오늘날처럼 산업이 역동적으로 바뀌는 때에는 적합하지 않다는 지적이 있습니다. 그러다 보니 일 잘 하는 사람, 말 못하는 사람들이 여러 일을 떠안기 일쑤입니다. 회사에서 업무를 정의하면 크게 두 가지입니다. E&E!

 

E&E!

우선 Exploitation 활용은 품질과 프로세스 개선 등을 빠르고 효율적으로 하는 것을 가리킵니다. 반면 Exploration 탐험은 새로운 가능성에 대한 탐구입니다.

 

Exploitation이 현재 업무를 개선하고 나아가는 것이라면, Exploration은 신 사업을 찾아 떠나는 여정입니다. 오늘날은 이를 어떻게 조화롭게 구성할지가 관건인데요. 몇몇 기업들은 이를 비율로 만들어 둡니다.

 

구글: 20% 타임제

구글은 직원이 여유 시간이 있어야 Exploration이 가능하다고 판단해요. 그래서 20% 타임제를 두고 있습니다. (물론 120% 야근제 아니냐는 지적도...) 구글은 80%는 본업을 하고, 20%, 즉 일주일에 하루 정도는 현재 수행하고 있는 업무와 전혀 관련이 없는 활동을 하도록 장려합니다. 그 결과 구글 뉴스, 애드센스 포 콘텐츠, 구글 서제스트 등이 태어났습니다.

 

3M: 15%

스카치 테이프로 유명한 3M 역시 15%룰을 운영합니다. 일부 부서에 국한된 이야기이긴 한데요. 연구 조직은 자신의 업무 시간 중 15%를 업무와 무관한 프로젝트에 사용할 수 있습니다. 또 프로젝트가 실패하더라도, 책임이나 이유를 따지지 않습니다. 그 결과, 우리가 흔히 쓰는 포스트-잇이 태어났어요.

 

🔎크게보기

R&R을 놓고 선배들과 후배들 간 견해차이가 큽니다. 선배들은 그렇게 업무를 명확히 구분하면, 어떻게 회사가 굴러가느냐고 하지만, 후배들은 명확하지 않다면, 공정하지 않다고 여깁니다. 개인적으로는 조직이 크면 클수록 업무가 명확한 게 좋다고 생각합니다. 그렇지 않으면, 인재들이 불만을 품기 때문인데요.

 

하지만 조직이 경직화되는 것은 경계해야합니다. 꽉 막힌 조직은 더디게 성장하기 때문입니다. 중요한 것은 조직 전체가 어떻게 하면, 효율적으로, 창의적으로, 꿈틀대게 할지 다 같이 고민할 수 있는 공동체 정신 아닐까 합니다.

 

https://stibee.com/api/v1.0/emails/share/EkB2Zdv2mId7G7lF066P6JmtpdRFblA

반응형
반응형

Top 30 JavaScript Interview Questions and Answers for 2024

 

https://javascriptcentric.medium.com/top-30-javascript-interview-questions-and-answers-for-2024-7f1e2d1d0638

 

Top 30 JavaScript Interview Questions and Answers for 2024

Prepare for your next JavaScript interview with confidence!

javascriptcentric.medium.com

 

Level-1: Basic

1. Is Javascript single-threaded?

2. Explain the main component of the JavaScript Engine and how it works.

3. Explain the event loop in JavaScript and how it helps in asynchronous programming.

4. Difference between var, let, and const ?

5. Different data types in Javascript?

6. What is callback function and callback hell ?

7. What is Promise and Promise chaining?

8. What is async/await ?

9.What is the difference between == and === operators ?

10. Different ways to create an Object in Javascript ?

11. What is rest and spread operator?

12. What is a higher-order function?

Level-2 : Intermediate

13. What is Closure? What are the use cases of Closures?

14. Explain the concept of hoisting in JavaScript.

15. What is a Temporal dead zone?

16. What is a prototype chain? and Object.create() method?

17. What is the difference between Call, Apply, and Bind methods?

18. What are lambda or arrow functions?

19. What is the currying function?

20. What are the features of ES6?

Level-3: Expert

21. What is Execution context, execution stack, variable object, scope chain?

22. What is the priority of execution of callback, promise, setTimeout, process.nextTick()?

23. What is the Factory function and generator function?

24. Different ways to clone (Shallow and deep copy of object) an object?

25. How to make an object immutable? (seal and freeze methods)?

26. What is Event and event flow, event bubbling and event capturing?

27. What is Event delegation?

28. What are server-sent events?

29. What is a web worker or service worker in javascript?

30. How to compare 2 JSON objects in javascript?

반응형
반응형

[MSSQL] 테이블 정보 확인

 

테이블 컬럼 정보 확인

select * from information_schema.columns

where table_name = ''

 

테이블 제약조건 확인 

select

*

from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE

where table_name = ''

 

테이블 인덱스 확인 확인 

SELECT * FROM sys.dm_db_index_physical_stats

 

반응형
반응형

[MSSQL] CHARINDEX 두개의 문자 에서 문자 찾기 

 

CHARINDEX(Transact-SQL)

이 함수는 두 번째 문자 식 내에서 하나의 문자 식을 찾고, 있는 경우 첫 번째 식의 시작 위치를 반환합니다.

 

DECLARE @document VARCHAR(64);  
SELECT @document = 'Reflectors are vital safety' +  
                   ' components of your bicycle.';  
SELECT CHARINDEX('bicycle', @document);  



-----------   
48

 

반응형
반응형

소프트웨어 개발자의 생산성을 측정하는 방법

https://www.itworld.co.kr/news/315198

 

기고 | 소프트웨어 개발자의 생산성을 측정하는 방법

소프트웨어 개발자의 효율성을 측정하는 것은 수십 년 동안 불가능한 것으로 여겨졌다. 두 명의 맥킨지 컨설턴트는 개발자가 개발자의 생산성을 측정할

www.itworld.co.kr

소프트웨어 개발자의 효율성을 측정하는 것은 수십 년 동안 불가능한 것으로 여겨졌다. 두 명의 맥킨지 컨설턴트는 개발자가 개발자의 생산성을 측정할 수 있는 방법을 소개한다.

우리는 다양한 산업 분야의 많은 기업과 협력한 결과, 소프트웨어 개발자의 생산성을 측정할 수 있는 방법을 찾았다. 3년 전, 맥킨지는 440곳 대기업의 개발자 속도를 분석했다. 그 결과 소프트웨어 개발자의 성과와 회사의 성공 사이에는 분명한 상관관계가 있다는 사실이 밝혀졌다. 이는 IT 기업뿐만 아니라 다른 분야에도 적용된다. 전 세계 소프트웨어 엔지니어의 약 절반이 IT 산업이 아닌 다른 산업군에서 일한다.
 

ⓒ Getty Images Bank
현재 전 세계적으로 약 2,700만 명의 개발자가 있으며, 440만 명이 미국에 있다. 미국 노동통계국은 2021년부터 2031년까지 이 숫자가 25% 더 증가할 것으로 예측하고 있다. 생성형 AI의 급격한 확산을 고려하면, 개발자 수요는 훨씬 더 커질 것이다.
 

성과와 직결되는 개발자 생산성

이런 조사 결과를 종합하면, 관리자는 소프트웨어 개발 인재를 가장 잘 활용할 수 있는 방법을 정확히 알아야 한다는 결론에 도달할 수 있다. 오늘날의 소프트웨어 개발은 창의적인 과정일 뿐만 아니라 협업 과정이기도 하므로 이는 쉽지 않은 일이다. 노력과 수익 간의 합리적인 관계를 보장하는 것은 결코 쉬운 일이 아니다. 이미 많은 기업이 시스템, 팀, 개인의 생산성을 측정하는 데 실패했다.

배치 빈도와 같은 알려진 지표는 팀의 생산성을 추적하는 데 도움이 될 수 있지만, 개인의 생산성을 추적하는 데는 도움이 되지 않는다. 하지만 우리는 개발자의 생산성을 측정하는 일이 가능하다고 생각한다. 특히 맥킨지는 이미 이 작업을 수행하고 있는 20여 곳의 IT, 금융 및 제약 회사와 협력하고 있다. 아직 100% 신뢰할 수 있는 결과는 얻은 것은 아니지만, 유망한 결과이다. 맥킨지의 계산에 따르면, 이들 기업은 개발자의 생산성을 측정하고 개선해 오류율을 평균 20~30% 줄이고 고객 만족도를 60%까지 높일 수 있었다.
 

개발자의 생산성을 측정하는 방법

우선, 구글과 마이크로소프트에서 개발한 두 가지 지표, 즉 소프트웨어 배치 처리량과 안정성을 측정하는 DORA(DevOps Research and Assessment)와 개발자의 개별 생산성을 측정, 이해 및 개선하기 위해 설계된 프레임워크인 SPACE(Satisfaction, Performance, Activity, Communication/Collaboration and Efficiency)를 활용한다. 맥킨지는 이들 지표를 다음과 같은 네 가지 '기회 지향 지표'로 보완했다.

내부 루프 및 외부 루프에 소요된 시간. 내부 루프는 코딩, 빌드, 단위 테스트 등 소프트웨어 제품 개발과 직접 관련된 활동을 포함한다. 외부 루프는 코드를 프로덕션 환경으로 이전하는 것과 관련된 활동으로, 통합, 테스트, 릴리스, 배치 등을 말한다. 개발자가 내부 루프에 더 많은 시간을 할애할수록 생산성이 높아지는데, 상위 기업의 경우 이 비율이 70%에 달한다.

개발자 속도 지수(Developer Velocity Index, DVI) 벤치마킹. 사내 프랙티스를 다른 회사 또는 경쟁사의 프랙티스와 비교함으로써 개선해야 할 영역을 파악할 수 있다. 백로그 관리, 테스트 또는 보안 및 규정 준수 등이 이에 해당한다.

개발자 기여도 분석. 팀이 백로그에 어떤 기여를 하고 있는지 평가한다. 백로그 관리를 측정하는 지라(Jira) 같은 툴을 사용해 성과 향상을 방해하는 부정적인 흐름을 파악할 수 있다. 작업 환경을 개선하고 자동화 수준을 높이거나 팀원 개개인의 기술을 최적화할 방법을 보여줄 수도 있다. 예를 들어, 한 회사는 자사의 최고 개발자들이 코딩 이외의 활동에 너무 많은 시간을 소비하고 있다는 사실을 깨달았고, 모든 개발자가 자신이 가장 잘하는 일에 집중할 수 있도록 운영 모델을 변경했다.

인재 관리. 인재 관리의 목표는 직원들이 각자의 재능과 선호도에 따라 배치하는 것이다. 업계 표준 역량 맵을 사용해 조직의 기존 지식, 기술 및 능력을 가시화할 수 있는 점수를 만들 수 있다. 이를 통해 격차와 약점을 파악할 수 있다. 예를 들어, 한 고객사는 경험이 부족한 개발자를 너무 많이 고용하고 있다는 사실을 깨달았다. 이 문제를 해결하기 위해 맞춤형 학습 프로그램을 제공했고, 개발자의 30%가 6개월 이내에 다음 단계의 역량에 도달했다.

이런 접근법은 DORA 및 SPACE와 함께 소프트웨어 생산성에 대한 차별화된 관점을 가능하게 한다. 또한 개발자에게 동기를 부여할 수 있는 방법, 적절한 툴와 전문 지식을 보유하고 있는지, 시간을 어떻게 사용하는지, 팀 구성이 최적화된 상태인지 등을 파악할 수 있다.
 

성공의 증거는 없지만 명확한 지표

개발자 생산성 측정은 여전히 논란의 여지가 있는 주제이며, 많은 전문가가 우리의 시도를 부정적으로 생각한다는 것도 알고 있다. 하지만 맥킨지와 긴밀하게 협력하는 20개 기업은 이에 동의하지 않는다. 우리는 소프트웨어 개발이 측정이 불가능할 정도로 복잡하고 신비롭다고 생각하지 않는다. 오히려 업데이트를 코딩하고 구현할 때 생성형 AI 도구를 사용하면 얼마나 개선되는지 꽤 잘 예측할 수 있다.

여기서 설명한 개발자 생산성 측정 시스템은 아직 완벽하지 않다. 우리는 개선해야 할 부분에 대한 건설적인 비판을 언제나 환영한다. 하지만 소프트웨어 개발의 중요성이 날로 커지고 인재 확보 경쟁이 치열해지는 상황에서 복잡하다고 미뤄두기에는 너무나 중요한 주제이다.

반응형
반응형

[PYTHON] 흐름대로 프로그래밍하는 Flowgorithm

 

https://wikidocs.net/book/8077

플로고리듬(Flowgorithm)은 프로그램의 구조를 시각적으로 나타내는 흐름도(flowchart)를 작성하는 도구이자, 그 자체로 프로그래밍 언어입니다. 플로고리듬으로 흐름도만 작성하면 다른 프로그래밍 언어로 코딩하는 과정 없이 곧바로 실행 결과를 볼 수 있으며, 의사코드(pseudocode) 및 각종 프로그래밍 언어 코드를 자동으로 생성할 수도 있습니다.

플로고리듬으로 아주 간단한 hello world 예제부터 시작해 점차 복잡한 알고리듬을 구현(!)해봄으로써, 순수한 재미도 느껴보고 교육이나 실무에 쓸모가 있을지도 알아보려고 합니다.

이 책을 따라 하다보면 다음을 자연스레 익힐 수 있을 것입니다.

  • 흐름도 작성법
  • 플로고리듬 사용법
  • 프로그래밍의 기본 원리
  • 의사코드
  • 기초 알고리듬

흐름도를 직접 작성하지 않더라도, 여기에 실린 흐름도와 실행 영상을 참고해서 각자 사용하는 언어로 구현하는 것도 좋습니다.

이 책에서 사용한 버전은 Flowgorithm 2.30.3입니다.

반응형
반응형

[PYTHON] 4 Ways to Solve FizzBuzz in Python

 

https://builtin.com/software-engineering-perspectives/fizzbuzz-python

 

4 Ways to Solve FizzBuzz in Python

FizzBuzz is a challenge that involves writing code that labels numbers divisible by three as “Fizz,” four as “Buzz” and numbers divisible by both as “FizzBuzz.” Here’s how to solve it in Python.  

builtin.com

he technical interview is hard to master and can be a nerve-racking experience. Not only do you need to know what you are talking about, but you also have to prove it to the person interviewing you. Fortunately, most fears of failure in this regard are exaggerated, and often, the interview will boil down to only a few potentially difficult questions.

4 METHODS FOR SOLVING FIZZBUZZ IN PYTHON

  1. Conditional statements.
  2. String concatenation.
  3. Itertools.
  4. Lambda.

One very common problem that programmers are asked to solve in technical interviews and take-home assignments is the FizzBuzz problem. FizzBuzz is a word game designed for children to teach them about division. In the game, each number divisible by three will be returned with a Fizz and any number divisible by four will return a Buzz. I was never a big fan of the test, but it can help weed out weaker applicants.

While the test is pretty easy to pass so long as you know the right operators, there are a variety of different ways to solve it. However, some solutions might prove to be more impressive than others, and I think this is something to keep in mind when working on this problem for a real interview. In addition to demonstrating these alternative methods of solving FizzBuzz, we are going to time each solution and compare the respective results.

 

How to Solve FizzBuzz in Python

1. CONDITIONAL STATEMENTS

The most popular and well-known solution to this problem involves using conditional statements. For every number in n, we are going to need to check if that number is divisible by four or three. If the number is divisible by three, it will print Fizz; if the number is divisible by four, it will print Buzz. The key here is simply knowing what operators to use to check for divisibility. In Python, we can use the modulus operator, %.

In computing, the modulo operation is meant to return the signed remainder of division. If a number is divisible by another, the remainder will always be zero, so we can use that to our advantage whenever we make our FizzBuzz function. We will structure condition blocks like this, where num is the iteration in a list of numbers.

    if num % 3 == 0:
        print('Fizz')

We can now build an iterative loop following the same principle, except we’ll be adding Fizz and Buzz:

for num in range(1,101):
    string = ""
    if num % 3 == 0:
        string = string + "Fizz"
    if num % 4 == 0:
        string = string + "Buzz"
    if num % 4 != 0 and num % 3 != 0:
        string = string + str(num)
    print(string)

ACE YOUR INTERVIEWExpect These Questions in Your Second-Stage Software Developer Interview

 

2. STRING CONCATENATION

Though incredibly similar to its regular conditional loop counterpart, the string concatenation method is another really great way to solve this problem. Of course, this method is also all but too similar to the conditional method. The significant difference here is that the conditionals are simply going to be affecting a small sequence of characters put into the string data-type.

for num in range(1,21):
 string = “”
 if num % 3 == 0:
 string = string + “Fizz”
 if num % 5 == 0:
 string = string + “Buzz”
 if num % 5 != 0 and num % 3 != 0:
 string = string + str(num)
 print(string)

 

3. ITERTOOLS

Another way we could approach this problem — as well as other iteration problems — is to use the standard library tool, itertools. This will create a loop with better performance than most other iteration methods. Itertools can be thought of as an iteration library that is built to mirror several other extremely performant libraries from other languages, except using pythonic methods for solving problems.

Itertools will need to be imported, however, it is in the standard library. This means pip won’t be necessary, but itertools is still considered a project dependency. We are going to utilize three different methods from this module:

  • cycle(): Cycle is a function takes a basic data-type and creates an iterator out of it. This function is useful and makes building custom iterators incredibly easy in Python.
  • count(): Count is another generator that iterates a range. This iterator is often called an “infinite iterator,” which basically means that the count() function could essentially loop on and on forever.
  • islice(): The islice function is short for “iteration slice.” We can use this iterator to cut out particular elements in a data structure and iterate them.

Combining these methods will allow us to create a new function where we can solve the FizzBuzz problem without using the typical iteration methods in Python that we might be used to.

import itertools as its
def fizz_buzz(n):
    fizzes = its.cycle([""] * 2 + ["Fizz"])
    buzzes = its.cycle([""] * 4 + ["Buzz"])
    fizzes_buzzes = (fizz + buzz for fizz, buzz in zip(fizzes, buzzes))
    result = (word or n for word, n in zip(fizzes_buzzes, its.count(1)))
    for i in its.islice(result, 100):
        print(i)

The benefits of using this methodology is that the itertools library’s methods of iteration are typically going to be a lot faster than the pythonic methods of iteration. While itertools is still pythonic, it is likely that the speed of iterative looping is going to improve when using this library over the typical for loop in Python. Needless to say, creating a faster algorithm than any other applicant could certainly put you on the map for getting the job. This is a valuable module and application of the module for programmers who are still searching for employment.

A tutorial on how to solve FizzBuzz in Python. | Video: Programming with Mosh

 

4. LAMBDA

Another method we could use to solve this problem is even more Pythonic of a solution, and it makes use of Python’s bridge to scientific computing, lambda. There are a lot of standard functions that can be used with these lambda expressions, and they certainly come in handy. One of the most frequently used methods in this regard is the map() method. This method is going to take an expression that we can create using lambda as well as an iterative data structure.

print(*map(lambda i: 'Fizz'*(not i%3)+'Buzz'*(not i%5) or i, range(1,101)),sep='\n')

For this example, I used the range generator, and the “not” keywords in order to reverse the polarity of the modulus operators usage.

ACE YOUR INTERVIEW15 Good Questions to Ask in an Interview

 

What’s the Best Way to Solve FizzBuzz in Python?

With all of these new ways to solve the problem, you might be wondering which one you should use. Of course, there are going to be trade-offs between the solutions, but in order to really make a great impression, we could narrow our decision down to using either the lambda method or the itertools method.

The lambda method has the advantage of being incredibly concise. However, depending on what code the map() method uses for iteration, it might trail behind the itertools method in terms of speed due to its less efficient iteration. The only way to figure out whether or not this is the case is to run some tests and compare our interpreter return times. So, that is going to be the mission between comparing these two heaps of code. In order to facilitate this comparison, I am going to be using the IPython magic in-line command, %timeit. Let’s start by trying it out on the itertools method. Since I wrote this as a function earlier, I can simply time the function call:

%timeit fizz_buzz(101)

Timed results for FizzBuzz using itertools. | Image: Emmett Boudreau

We will do the same with the lambda method:

%timeit print(*map(lambda i: 'Fizz'*(not i%3)+'Buzz'*(not i%5) or i, range(1,101)),sep='\n')

Timed results for FizzBuzz using the lambda method. | Image: Emmett Boudreau

Just as I predicted, the itertools method came in just a little faster, while the lambda method lagged slightly behind losing less than a millisecond off of the overall interpretation time. The answer here is somewhat of a mixed bag because the concise nature of the lambda expression and map() function in tandem make the lambda method appear to be a lot more impressive. But the compile time of the itertools method is most certainly impressive because of its speed.

As is often the case in programming, there are multiple ways to do one thing, and as is also often the case, some ways are significantly better than others. There are certainly some trade-offs depending on what methodology you select, but this is what defines your own style as a programmer. I believe regardless  of the decision that is made, using these faster methods will almost certainly make any aspiring programmer look a lot more proficient in their take home assignment. Furthermore, any aspiring programmer could certainly learn a lot more about programming and the language they are programming in by trying out different methods of doing the same thing. 

반응형
반응형

[python] Print Calendar 

from calendar import*
year = int(input('EnterYear: '))

print(calendar(year, 2, 1, 8, 3))

#2 = 2 characters for days (Mo, Tu, etc)
#1 = 1 line (row) for each week
#8 = 8 rows for each month
#3 = 3 columns for all months of the year.

반응형

+ Recent posts