today::エンジニアに憧れる非エンジニア

今のところは、エンジニアとは言えないところの職種です。しかしエンジニア的なものの考え方に興味津津。

Pythonあれこれ 2021-01-23

概要

「Head First Python 第2版」を進めていった中で考えたことの記録です。

Head First Python 第2版 ―頭とからだで覚えるPythonの基本

Head First Python 第2版 ―頭とからだで覚えるPythonの基本

  • 作者:Paul Barry
  • 発売日: 2018/03/24
  • メディア: 単行本(ソフトカバー)

call by sharing

first = [1, 2, 3, 4, 5]
print(first)
# => [1, 2, 3, 4, 5]
second = first
print(second)
# => [1, 2, 3, 4, 5]
print(id(first))
# => 2915364366464 ※一例
print(id(second))
# => 2915364366464 ※一例

上記コードにおいて注目すべきポイントは、「id(second)の値とid(third)の値が同じである」という点です。

Pythonの代入演算子変数a = 変数bという形で使用した場合、「変数aが指すオブジェクトの別名として変数bを定義する」という動作をします。このような評価戦略は、「call by sharing」「共有渡し」「参照の値渡し」などと呼ばれます1

上記の例でいうところのid:2915364366464というオブジェクトは、「最初にfirstに代入した[1, 2, 3, 4, 5]というリスト」を指します。secondid2915364366464です。

この状態でsecond.append(6)を実行した場合の動作は以下のようになります。

second.append(6)
print(second)
# => [1, 2, 3, 4, 5, 6]
print(first)
# => [1, 2, 3, 4, 5, 6]

secondが指すリストもfirstが指すリストも同一のオブジェクトなので、そこにappend()という操作を行うと、append()の結果はsecondにもfirstにも反映される、というわけです。

なお、「secondそのものがfirstの別名とされる」わけではありません。この状態でいえば、「firstが指すオブジェクトそのものを入れ替えても、secondが指すオブジェクトはそのまま維持される2」という動作になります。

print(id(first))
# => 2915364366464 ※一例
print(id(second))
# => 2915364366464 ※一例
first = [1, 2, 3, 4, 5]
print(id(first))
# => 2915364749760 ※一例
print(id(second))
# => 2915364366464 ※一例

上記コードの注目ポイントは以下です。

  • first = [1, 2, 3, 4, 5]以前は、id(first)の値とid(second)の値が同じものであったこと
  • first = [1, 2, 3, 4, 5]以降は、id(first)の値とid(second)の値が違うものになっていること
  • first = [1, 2, 3, 4, 5]以降も、id(second)の値は変わらないこと

リストをコピーするには

リストをコピーするためのメソッドとして、リストにはcopy()というメソッドが用意されています。

print(second)
# => [1, 2, 3, 4, 5, 6]
print(id(second))
# => 2915364366464 ※一例
third = second.copy()
print(third)
# => [1, 2, 3, 4, 5, 6]
print(id(third))
# => 2915364744320 ※一例
third.append(7)
print(third)
# => [1, 2, 3, 4, 5, 6, 7]
print(second)
# => [1, 2, 3, 4, 5, 6]
print(id(second))
# =>2915364366464
print(id(third))
# => 2915364744320

上記コードの注目ポイントは以下です。

  • id(second)の値とid(third)の値が異なること
  • third.append(7)を実行した後も、secondが指すリストの内容は変わらないこと
    • id(second)の値も変わらない
  • third.append(7)を実行した後も、id(third)の値は変わらないこと

  1. 「call by sharing」などと称される評価戦略の名称については、文脈ごとに異なったものが使われ、広く一致したものがありません。

  2. なお、このような操作をした場合に「firstが指すオブジェクトそのものを入れ替えると、secondが指すオブジェクトもfirstが指すオブジェクトに入れ替えられる」という評価戦略もあり、そちらは「参照渡し(call by reference)」と呼ばれます。C#におけるinoutrefが参照渡しの例です。

「Head First Python」2章 - panic.pyの動作を説明してみる

概要

「Head First Python 第2版」を進めていった中で考えたことの記録です。

Head First Python 第2版 ―頭とからだで覚えるPythonの基本

Head First Python 第2版 ―頭とからだで覚えるPythonの基本

  • 作者:Paul Barry
  • 発売日: 2018/03/24
  • メディア: 単行本(ソフトカバー)

サンプルコード

phrase = "Don't panic!"
plist = list(phrase)
print(phrase)
print(plist)
for i in range(4):
    plist.pop()
plist.pop(0)
plist.remove("'")
plist.extend([plist.pop(), plist.pop()])
plist.insert(2, plist.pop(3))
new_phrase = ''.join(plist)
print(plist)
print(new_phrase)

最終的にどうなるのか

標準出力に以下の内容が表示されます。

Don't panic!
['D', 'o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c', '!']
['o', 'n', ' ', 't', 'a', 'p']
on tap

内部的な動作は以下となります。

  1. 文字列Don't panic!を生成し、リストに変換する
  2. 1.で生成された文字列の内容とリストの内容を標準出力に表示する
  3. 1.で生成されたリストに様々な操作を行い、文字列on tapが生成されるようなリストに作り替える
  4. 3.の操作を行ったリストから、文字列on tapを生成する
  5. 3.の操作を行ったリストの内容と4.で生成された文字列の内容を標準出力に表示する

このコードで行う処理を理解するにあたり、重要な事柄は以下と思われます。

  • Don't panic!という文字列には、on tapという文字列に必要な文字が全て含まれている

上記サンプルコードを実行して発生すること

初期状態を作る

phrase = "Don't panic!"
plist = list(phrase)
print(phrase)
print(plist)
  1. 変数phraseに、文字列リテラル1Don't panic!を代入する
  2. 変数phraseの内容を元としてリストを生成し、生成されたリストを変数plistに代入する
    • 生成されるのは、「変数phraseの1文字を1要素としたリスト」である
  3. 変数phraseが指す内容を標準出力に表示する
  4. 変数plistが指す内容を標準出力に表示する

この時点で、標準出力には以下の内容が表示されます。

Don't panic!
['D', 'o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c', '!']

末尾4文字は不要なので削除する

Don't panic!という文字列のうち、末尾4文字のnic!on tapという文字列に含まれません。文字列on tapを生成するには不要な文字なので、plistから除去してしまいます。

引数なしのpop()をリストに対して実行すると、対象のリストの末尾1要素が除去されます。plistに対してpop()を4回実行すれば、末尾4要素が除去されるわけです。

Pythonにおいて「処理を4回繰り返し実行する」最もシンプルな方法は、「大きさ4の範囲を対象としてfor文を実行する」というものですね。

結果、plist.pop()を4回繰り返し実行するコードは以下になります。

for i in range(4):
    plist.pop()

実際にplistに対してpop()を4回実行すると、各回の結果は以下のようになります。

plist.pop()
# plist => ['D', 'o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c']

plist.pop()
# plist => ['D', 'o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i']

plist.pop()
# plist => ['D', 'o', 'n', "'", 't', ' ', 'p', 'a', 'n']

plist.pop()
# plist => ['D', 'o', 'n', "'", 't', ' ', 'p', 'a']

他の不要な文字を削除する

現時点のplistから文字列を生成すると、結果は以下のようになります。

print(''.join(plist))
# => Don't pa

この時点では、文字列on tapを生成するためにはD'という不要な文字が残っています。この2文字をplistから除去する必要があります。

最初の不要な文字であるDは、plistの先頭の要素として存在します。Pythonにおいて、リストの先頭の要素を指すインデックス番号は0です。ということは、「plistに対してpop(0)を実行すれば、plistからDを取り除くことができる」ことになりますね。

# plist => ['D', 'o', 'n', "'", 't', ' ', 'p', 'a']
plist.pop(0)
# plist => ['o', 'n', "'", 't', ' ', 'p', 'a']

もう一つの不要な文字である'は、文字そのものを指定して取り除くこととしましょう。Pythonのリストにおいては、例えばxという値を持つ最初の要素を取り除く場合、remove(x)を実行すればOKです。"'"という値であれば、remove("'")を実行すればよいわけですね。

# plist => ['o', 'n', "'", 't', ' ', 'p', 'a']
plist.remove("'")
# plist => ['o', 'n', 't', ' ', 'p', 'a']

必要な文字だけが残ったので、順番を入れ替える

現時点のplistから文字列を生成すると、結果は以下のようになります。

print(''.join(plist))
# => ont pa

plistにはon tapという文字列を生成するために必要な文字だけが残っています。しかしながら、順番が一致していません。ont paon tapにするには、例えば以下の操作の組が必要となります。

  1. 現在4文字目にある空白文字を3文字目に移動する
    • ont paの4文字目にある空白文字を3文字目に移動すると、on tpaになる
  2. 末尾2文字を入れ替える
    • on tpaの末尾2文字を入れ替えると、on tapになる
末尾2文字を入れ替える

同じリストに対し、引数なしのpop()メソッドを2回実行すると、各pop()メソッドの戻り値はそれぞれ以下となります。

  • 1回目のpop()メソッドの戻り値…元のリスト末尾の要素の値
  • 2回目のpop()メソッドの戻り値…元のリスト末尾から2つ目の要素の値
plist = ['o', 'n', 't', ' ', 'p', 'a']
print(plist.pop())
# => a
print(plist.pop())
# => p
# plist => ['o', 'n', 't', ' ']

「あるリストに対してpop()メソッドを2回実行し、実行結果を順番に並べたリスト」を生成すると、その中身はどうなるのでしょうか。答えは、「元のリスト末尾から2つの要素を、元のリストにおける順番とは逆順に並べたリスト」となるのです。

plist = ['o', 'n', 't', ' ', 'p', 'a']
print([plist.pop(), plist.pop()])
# => ['a', 'p']

リストaの末尾に新たな要素を追加するメソッドの一つに、a.extend(x)メソッドがあります。a.extend(x)メソッドには、「引数xにリストを与えた場合、リストxを構成する一つ一つの要素が順にリストaの末尾に順番に追加される」という特徴2があります。

上記を踏まえると、「リストplistの末尾2要素の順序を入れ替える」ためには、以下の処理を実行すればよい…ということになります。

# plist => ['o', 'n', 't', ' ', 'p', 'a']
plist.extend([plist.pop(), plist.pop()])
# plist => ['o', 'n', 't', ' ', 'a', 'p']
4文字目と3文字目を入れ替える

Pythonのリストには、以下の特徴があります。

  • リストのpopメソッドを実行すると、その戻り値は「リストから除去された要素」となる
  • リストのinsert(i, x)メソッドを実行すると、当該リストに新たな要素を挿入することができる
    • 新たな要素を挿入する位置は、インデックスiの直前
    • 挿入される要素の内容はx

plistから生成される文字列の4文字目と3文字目を入れ替えるには、「plistの4番目の要素を除去し、その内容をplistの3番目の要素の直前に挿入する」という操作を行えばよいということになります。Pythonのリストにおいて、インデックス番号は0から始まるので、4番目の要素のインデックス番号は3、3番目の要素のインデックス番号2です。以上を踏まえると、現時点で必要な処理は以下となります。

plist.insert(2, plist.pop(3))

現時点のplistに対し、実際に上記の処理を実行すると、その結果は以下のようになります。

# plist => ['o', 'n', 't', ' ', 'a', 'p']
plist.insert(2, plist.pop(3))
# plist => ['o', 'n', ' ', 't', 'a', 'p']

以上にて、pliston tapという文字列を生成できる内容のリストとなりました。

文字列からリストを生成する

Pythonにおいて、文字列からリストを生成するためには、以下の関数を実行するのが最もシンプルと思われる方法です。

'*区切り文字列*'.join(x)

文字列のjoin(x)メソッドですね。「引数xで与えたリストの各要素を、*区切り文字列*で指定した文字列を区切り文字列として連結した文字列を返す」という動作をします。*区切り文字列*に空文字列を与えれば、引数xで与えたリストの内容は、区切り文字なしで連結されることになります。

# plist => ['o', 'n', ' ', 't', 'a', 'p']
new_phrase = ''.join(plist)
# new_phrase => 'on tap'

処理結果を標準出力に表示する

# plist => ['o', 'n', ' ', 't', 'a', 'p']
# new_phrase => 'on tap'
print(plist)
print(new_phrase)

内部的な動作は以下となります。

  1. 変数plistが指す内容を標準出力に表示する
  2. 変数new_phraseが指す内容を標準出力に表示する

plistおよびnew_phraseが上記の内容であれば、標準出力に表示される内容は以下となります。

['o', 'n', ' ', 't', 'a', 'p']
on tap

以上で、サンプルコード全体の説明が終わりました。


  1. より正確には「文字列リテラルへの参照」と言ったほうがいいのではないかと考えています。ただし、このあたりの違いは、本項目で説明する内容において本質的な事柄ではないため、簡単に「文字列リテラル」と言ってしまいます。以降同様の概念についても、「○○への参照」とはあえて言わないこととします。

  2. これに対し、a.append(x)メソッドの引数xにリストを与えた場合、「リストxそのものがリストaの末尾に追加される」という動作になります。

Pythonあれこれ 2021-01-19

概要

「Head First Python 第2版」を進めていった中で考えたことの記録です。

Head First Python 第2版 ―頭とからだで覚えるPythonの基本

Head First Python 第2版 ―頭とからだで覚えるPythonの基本

  • 作者:Paul Barry
  • 発売日: 2018/03/24
  • メディア: 単行本(ソフトカバー)

Pythonのrangeについて

  • 連番や等差数列を表すオブジェクト
  • 日本語では「範囲」と言われる
  • 1引数のrange(stop)関数が生成するもの
    • range型のオブジェクト
    • 始値は0
    • 終了値はstop未満の最大の整数
    • 連番間の差分は1

dunderとは

  • double underscoreの略
  • 一部の特殊キーワードを識別するために用いられる記号__を指す
  • もしくは、__で囲まれた名前の接頭辞として用いる
    • __main__…dunder main
    • __name__…dunder name
    • __init__…dunder init
    • その他多数

mail.python.org

コンテナとイテレータ

  • コンテナ(container)…反復処理の対象となるオブジェクト
  • イテラブル(iterable)…イテレータを使った処理の対象とすることが可能なオブジェクト種別
    • Pythonにおいては、範囲・タプル・リスト・文字列等がイテラブルである
  • イテレータ(iterator)…コンテナに対する反復処理において、現在処理対象となっているオブジェクトを返すオブジェクト
  • Pythonfor文は、for <iterator> in <container>:というのが基本構文となる
    • Rubyだと、<container>.each { |<iterator>| ... }または<container>.each do |<iterator>| ... end

www.atmarkit.co.jp

Pythonでは「すべてがオブジェクト」である

  • 整数、文字列、関数、テンプレート…すべてはオブジェクトである
  • Javaにおける「プリミティブ型」に相当する概念は存在しない
  • すべての基底クラスたるObjectが存在する
    • 整数、文字列、関数、テンプレート…すべてはObjectを継承している
  • 関数も(第一級)オブジェクトである

developer.mozilla.org

シーケンス型の特徴

  • リスト…動的、可変
  • タプル…不変
  • 辞書…順序なし、キーと値の組、可変
  • 集合…重複なし、順序なし、可変

リストには組み込みメソッドが含まれる

  • リストそのものもオブジェクトなので、組み込みメソッドが含まれることに何ら不思議はない
  • 以下はリストの組み込みメソッドの例
    • append(x)
    • extend(iterable)
    • insert(i, x)
    • remove(x)
    • pop([i])

docs.python.org

リストからオブジェクトを取り除くための関数あれこれ

  • remove(x)
    • リスト中の、xという値を持つ最初の要素を取り除く
    • 該当する要素がなければ、例外ValueErrorをスローする
    • 戻り値はNoneである
  • pop([i])
    • リスト中の指定した位置にある要素を取り除く
    • 該当する要素がなければ、例外ValueErrorをスローする
    • 戻り値は取り除いた要素である
    • 引数iは省略可能
      • 引数なしのpop()は、リスト末尾の要素を取り除く

Pythonあれこれ 2021-01-17

概要

「Head First Python 第2版」を進めていった中で考えたことの記録です。

Head First Python 第2版 ―頭とからだで覚えるPythonの基本

Head First Python 第2版 ―頭とからだで覚えるPythonの基本

  • 作者:Paul Barry
  • 発売日: 2018/03/24
  • メディア: 単行本(ソフトカバー)

Python」という言葉は何を指すか

Pythonには何が存在しないか

  • C言語Javaで用いられるところの、「コンパイル」や「リンク」という概念
    • 「編集→コンパイル→リンク→実行」という一連の流れ
    • Pythonにおいては、編集・保存が済んだコードは直ちに実行できる

Pythonはバッテリー付属」という言葉の意味

  • 豊富な機能を持った初期ライブラリ群の存在
  • (小規模ながら)IDEも付属
    • Pythonそのものに付属するIDEは「IDLE」という名前である

オフサイドルール

  • 字下げそのものが文の構造を記述するための記号である
    • 「字下げにおけるタブ文字とスペースの混在」は強く忌避される

「リスト」というデータ型がある

  • リストに対しては、演算子inを使うことができる
  • 関連する概念として、以下のようなデータ型も存在する
    • タプル(tuple)
    • 辞書(dictionary)
    • 範囲(range)
    • 集合(set)

「シーケンス型」という概念が存在する

  • 「順番を持った複数データを扱うための型」を一般化したもの
  • 実際にシーケンス型に該当する型としては以下
    • リスト(list)
    • タプル(tuple)
    • 範囲(range)
    • バイナリシーケンス(binary sequence)
      • bytearray…listに相当するバイナリシーケンス
      • bytes…tupleに相当するバイナリシーケンス
    • 文字列(string)

docs.python.org

python-remrin.hatenadiary.jp

ライブラリ、モジュール、関数

  • Pythonでは、外部のライブラリから既存の機能をインポートして使うことができる
    • 特に、Pythonが標準で備えているライブラリを「標準ライブラリ」と呼ぶ
  • モジュールや関数は、ライブラリの構成単位である
    • 関数はモジュールの一部である
    • モジュールはライブラリの一部である
  • 関連する概念の例は以下

import

import datetime

↑標準ライブラリからdatetimeモジュールをインポートする例

from os import getcwd

↑標準ライブラリのosモジュールからgetcwd関数をインポートする例

上述import ...from ... import ...では、インポートされる要素がどの名前空間で扱われるかが異なる

  • import ...…モジュール名と同一名称の名前空間
  • from ... import...__main__

異文化入り混じる組織において、コミュニケーションの道しるべとなる考え方あれこれ

概要

いわゆる「典型的日本企業」においても、典型的日本とは異なる文化的バックボーンを持つ人材の進出は加速していく…現在はそのような世の中の流れにあります。この流れは、日本における「生産年齢人口の減少」といった中長期トレンドも背景にあるため、今後も不可逆的なものなのであろうと思います。

しかしながら、文化的同質性が強い組織において、「何も準備ができていないところに急に異文化の流入が進む」という事態が進むと、不幸な文化衝突の発生はおそらく避けられません。不幸な文化衝突をできる限り避けるためには、「文化による考え方の違い」「文化によるコミュニケーションスタイルの違い」について、その存在と中身を大雑把にでも知っておく必要があろうかと思います。

この記事は、上記「文化による考え方の違い」「文化によるコミュニケーションスタイルの違い」についての備忘録として記述してみた記事です。

ソクラテス式」と「孔子式」

「学校教育における授業形態」「ビジネスなどの場における議論」等、意見交換的な場におけるコミュニケーションスタイルの違いを大雑把に二分した概念です。

  • ソクラテス
    • 積極的な双方向の意見交換が評価される
    • 聞き手間の意見交換が評価される
    • 相手が話している最中に話を遮ることも厭わない
  • 孔子
    • 話し手と聞き手の役割分担が明確化されている
    • 話し手と聞き手の立場は固定的なものである
    • 相手の話は最後まで聞くものである

一般に、「欧米はソクラテス式寄り」「日本を含むアジア圏は孔子式寄り」とされているそうです。

テトリス式」と「アメーバ式」

事業組織における、担当業務と役割分担についての考え方の違いを大雑把に二分した概念です。

  • テトリス
    • 自分の担当業務に専念して専門性を上げていくことが自分の責任範囲・チームへの貢献とする
    • 「ジョブ型雇用」と結びつきが深い
  • アメーバ式
    • 自分の責任範囲に明確な線引きをしない
    • 担当業務を超えてでも組織やチームに貢献することが求められるとする
    • 「メンバーシップ型雇用」と結びつきが深い

日本の事業組織は典型的な「アメーバ式組織」とされます。 下記マイナビニュースの記事では、日本の事業組織について「新卒一括採用という日本特有の採用形態に基づき、ノースキルの若者を採用するため、組織形態もアメーバ式とならざるを得ない」という趣旨の言及がなされています。

news.mynavi.jp

「モノクロニック」と「ポリクロニック」

時間感覚の違いを大雑把に二分した概念です。

  • モノクロニック
    • 「時間は一方的に、直線的に流れていく」という考え方
    • 約束の時間や期日に対して厳格である
  • ポリクロニック
    • 「時間軸は複数存在し、それぞれの時間軸によって進むスピードは様々」という考え方
    • 「終わりよければすべてよし」的に考える

一般に、「北米・欧州北部はモノクロニックな文化特性が強い」「中南米やアジア圏はポリクロニックな文化特性が強い」とされているそうです。

日本における「モノクロニック」と「ポリクロニック」

日本については、「同一文化内にモノクロニック性とポリクロニック性が混在する」といえるのではないでしょうか。 日本文化のモノクロニック性とポリクロニック性については、以下のような特徴を挙げることができます。

  • 日本文化のモノクロニック性
    • 交通機関などのダイヤグラムは極めて正確に厳守される
    • 始業時間に対して厳格である
    • 「従来型のパッケージツアー」や「弾丸旅行」といった、極めてタイトなタイムスケジュールの旅行が行われる
  • 日本文化のポリクロニック性
    • 終業時間に対してルーズであり、残業を厭わない
    • 「お客様事情」や「上司事情」といった割り込みが広く許容される

その他

このほかにも、コミュニケーションの文脈依存性についての「ハイコンテクスト・ローコンテクスト」という二分法が存在します。

関連リンク

mercan.mercari.com

amedori.exblog.jp

「限定された倫理性」考

「限定された倫理性」とは

「限定された倫理性」は、「倫理的に振る舞おうとする意思を当事者が有するにもかかわらず、実際には当事者が非倫理的な行動をとってしまう原因となる行動」を指す言葉です。

  • マックス・H・ベイザーマン(Max.H.Bazelman)らにより、2011年に提唱された
  • 「当事者に悪意がないにもかかわらず発生する企業不祥事1が増加を続けているのはなぜか」という問題意識から生まれた考え方である

「限定された倫理性」については、以下の書籍「倫理の死角ーなぜ人と企業は判断を誤るのか」にて、詳しく言及されているとのことです。

www.amazon.co.jp

「限定された倫理性」の構成要素

「限定された倫理性」は、以下5つの要素により構成されます。

配慮に欠く目標設定

以下のような目標設定を指します。

  • 非倫理的行動に出た方が当人の利益になる目標設定
  • 意図せぬ非倫理的行動の助長につながる目標設定

動機付けられた見落とし

「他人の非倫理的行動に対し、見て見ぬふりをするほうが自分の利益になる」という状況を指します。 「見て見ぬふりによる自己保身」というのは、相手の非倫理的行動をエスカレートさせるとされています。

間接的であるがゆえの見落とし

「自分が手を下したくない仕事を請け負ってくれた相手に対し、便宜を図るような行動をとること」を指します。 相手に「借り」を作ることは、相手の非倫理的行動をエスカレートさせるとされています。

滑りやすい坂

「特定の人物の非倫理的行動に対し、当人のみならず、周囲の誰も気づかない」という状況を指します。 そうした状況下では、一度でも非倫理的行動が発生すると、それを止める手立てはもはや存在しません。

結果の過大評価

「成果さえ出していれば、過程における非倫理的行動は許容される」という状況を指します。

関連リンク

当記事の内容については、主に以下の論文を参照して記述しました。

以下、その他関連リンクです。


  1. 「多くの人が知っていたこと、当たり前でしかも評価されていたことが、不祥事となって問題となった」(池田耕一)というのが典型的なパターンです。

建設業に関係する官庁の多さ

概要

建設業は、その事業活動に関係する官庁が多い業種です。 事業活動に関係する官庁が多いゆえの問題も発生します。

この記事では、以下の事柄について記述していきます。

  • 建設業に関係する官庁
  • 事業に関係する官庁が多いことによる問題点

建設業に関係する官庁

一般的な建設業の場合、特に強い影響力を有する官庁としては、以下の2つがあります。

また、工事種別・工事内容によっては、国土交通省厚生労働省以外の官庁が関係する場合もあります。

国土交通省

建設業は、「建設業法」という業法が存在する許認可事業です。

一般に、業法が存在する許認可事業においては、業法を管轄する官庁が事業形態に大きな影響力を持つことになります。 建設業法を管轄する官庁は国土交通省です。 ゆえに、建設業における業務の進め方は、建設業法ひいてはその監督官庁である国土交通省に強く影響されることが避けられません。

厚生労働省

労働安全衛生法をはじめとする労働法制

建設業は、労働安全衛生法労災保険制度上特別な扱い1がなされています。 以下のような事柄が主な理由です。

  • 業務全体に占める危険有害業務の割合が、全産業の中でも格段に高い
    • 労働安全衛生法に定める免許・技能講習・特別教育が業務従事に必要とされる場合が多い
  • 労災事故の発生件数が、全産業の中でも高い割合を占める
  • 重層下請構造が一般的ゆえ、労災事故発生時の責任の所在が曖昧になりやすい

労働安全衛生法労災保険制度をはじめとして、各種労働法制を管轄する官庁は厚生労働省です。 そのため、建設業における業務の進め方は、厚生労働省にも強く影響されます。

職業能力開発促進法

建設業は、職業訓練の枠組みが早期に整備された産業でもあります。 職業能力開発促進法に定める技能検定のうち、建設関係の職種に関わるものは2020年12月時点で34種類が存在します。

jobken.jp

職業訓練の枠組みを管轄する官庁は厚生労働省です。

その他の官庁

特に許認可事業に関係する設備の工事においては、関係する官庁の数はさらに増えます。 主に「発注者の事業に対する監督官庁」のことですね。

また、道路を使用する作業の場合は、道路交通に関係する以下のような官庁も関係してきます。

建設業の事業活動では多くの廃棄物を出すことが避けられません。 廃棄物処理法を管轄する環境省も、建設業の事業行為に関係する官庁といえるでしょう。

事業活動に関係する官庁が多いことによる問題点

事業活動に関係する官庁が多いことに起因して、以下のような問題点が発生してきます。

  • 一見して意味が分からない縄張りが発生する
  • 異なる官庁の管轄範囲の境界領域が無法地帯化する

他にも「事務作業が増える」等の問題もあります。

一見して意味がわからない縄張りが発生する

ここで言う「一見して意味がわからない縄張り」というのは、以下のような状況を指します。

  • 似たような語句(場合によっては全く同じ語句)を使っているにも関わらず、法律上異なる概念が複数存在する
  • 一見して違いがわからない、似たような分野・内容を指す概念が複数存在する

「一見して意味がわからない縄張り」の例は以下です。

建設業に対する「業務内容が複雑でわかりにくい」というイメージの存在は、こうした「一見して意味がわからない縄張りの存在」が一因となっているのではないでしょうか。

異なる官庁の管轄範囲の境界領域が無法地帯化しやすい

建設業のように多くの官庁が関係する事業の場合、各官庁の管轄範囲の境界も相応に多く存在します。 各官庁の管轄範囲の境界領域は、いずれの官庁も踏み込みたがらず、往々にして無法地帯化するものです。

建設業に存在する「異なる官庁の管轄範囲の境界領域に存在する無法地帯」の例は以下です。

  • 現場の安全衛生マネジメントにおける一人親方等の位置づけ
  • 現場掛け持ちの際の労災保険の扱い
  • 建設技能者のキャリアマネジメントのあり方

「建設業で働く人が、建設業およびその将来に対して暗く重苦しいイメージを持っている」…そのような現状は、「働き方において大事な部分が無法地帯化している」というのも理由ではないかと思います。

まとめ

  • 建設業に関係する官庁は多い
  • 事業活動に関係する官庁が多いゆえの問題が存在する
    • 一見して意味が分からない縄張りが発生する
    • 異なる官庁の管轄範囲の境界領域が無法地帯化する

  1. 「特定元方事業者と統括安全衛生管理」「労災保険の元請一括加入」等がその例です。