While I've never been a fan of rigid hierarchies or of the notion that all communications between persons not reporting to the same supervisor go through the chain of command (one of the reasons why I like working in a small company), I do think there should be clear deliniation of responsibility between individuals and groups. Anybody can have a good idea about how to improve the company's computer systems, but you still need people whose specific job is to administer them. Anybody can have a good idea as to how to better sell the company's products, but the company still needs people whose specific job is to promote them.
It is also vital for computer professionals to be fully acquainted with the wants and needs of their users so as to maximize the probability of giving them what they can actually use. If it's the job of an IT employee to support the sales staff, he should be communicating with them directly; likewise if his job is to support the accounting department, the legal staff or any other part of the company (fraternization should be actively encouraged). Likewise, those who develop software should be well acquainted with the people who are supposed to be using what they produce. Those developing word processing software should be communicating regularly with secretaries, newpaper reporters, and other professional writers. Those who develop data analysis software should likewise be communicating with statisticians and analysts, Accordingly, I think every professional programmer should be required to provide part time tech suppport to the people who use what he writes; not so much that he doesn't have time to do his primary job, but enough that he understands the needs of his users and the problems associated with the software as it is; it's called "accountability"; and experience suggests that quality of service is inversely proportional to the distance between the person providing the service and the one receiving it.